| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375 | /* Copyright 2012 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* jshint globalstrict: false *//* umdutils ignore */(function (root, factory) {  'use strict';  if (typeof define === 'function' && define.amd) {define('pdfjs-dist/build/pdf', ['exports'], factory);  } else if (typeof exports !== 'undefined') {    factory(exports);  } else {factory((root.pdfjsDistBuildPdf = {}));  }}(this, function (exports) {  // Use strict in our context only - users might not want it  'use strict';var pdfjsVersion = '1.4.20';var pdfjsBuild = 'b15f335';  var pdfjsFilePath =    typeof document !== 'undefined' && document.currentScript ?      document.currentScript.src : null;  var pdfjsLibs = {};  (function pdfjsWrapper() {(function (root, factory) {  {    factory((root.pdfjsSharedGlobal = {}));  }}(this, function (exports) {  var globalScope = (typeof window !== 'undefined') ? window :                    (typeof global !== 'undefined') ? global :                    (typeof self !== 'undefined') ? self : this;  var isWorker = (typeof window === 'undefined');  // The global PDFJS object exposes the API  // In production, it will be declared outside a global wrapper  // In development, it will be declared here  if (!globalScope.PDFJS) {    globalScope.PDFJS = {};  }  if (typeof pdfjsVersion !== 'undefined') {    globalScope.PDFJS.version = pdfjsVersion;  }  if (typeof pdfjsVersion !== 'undefined') {    globalScope.PDFJS.build = pdfjsBuild;  }  globalScope.PDFJS.pdfBug = false;  exports.globalScope = globalScope;  exports.isWorker = isWorker;  exports.PDFJS = globalScope.PDFJS;}));(function (root, factory) {  {    factory((root.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedGlobal);  }}(this, function (exports, sharedGlobal) {var PDFJS = sharedGlobal.PDFJS;/** * Optimised CSS custom property getter/setter. * @class */var CustomStyle = (function CustomStyleClosure() {  // As noted on: http://www.zachstronaut.com/posts/2009/02/17/  //              animate-css-transforms-firefox-webkit.html  // in some versions of IE9 it is critical that ms appear in this list  // before Moz  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];  var _cache = {};  function CustomStyle() {}  CustomStyle.getProp = function get(propName, element) {    // check cache only when no element is given    if (arguments.length === 1 && typeof _cache[propName] === 'string') {      return _cache[propName];    }    element = element || document.documentElement;    var style = element.style, prefixed, uPropName;    // test standard property first    if (typeof style[propName] === 'string') {      return (_cache[propName] = propName);    }    // capitalize    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);    // test vendor specific properties    for (var i = 0, l = prefixes.length; i < l; i++) {      prefixed = prefixes[i] + uPropName;      if (typeof style[prefixed] === 'string') {        return (_cache[propName] = prefixed);      }    }    //if all fails then set to undefined    return (_cache[propName] = 'undefined');  };  CustomStyle.setProp = function set(propName, element, str) {    var prop = this.getProp(propName);    if (prop !== 'undefined') {      element.style[prop] = str;    }  };  return CustomStyle;})();PDFJS.CustomStyle = CustomStyle;exports.CustomStyle = CustomStyle;}));(function (root, factory) {  {    factory((root.pdfjsSharedUtil = {}), root.pdfjsSharedGlobal);  }}(this, function (exports, sharedGlobal) {var PDFJS = sharedGlobal.PDFJS;var globalScope = sharedGlobal.globalScope;var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];var TextRenderingMode = {  FILL: 0,  STROKE: 1,  FILL_STROKE: 2,  INVISIBLE: 3,  FILL_ADD_TO_PATH: 4,  STROKE_ADD_TO_PATH: 5,  FILL_STROKE_ADD_TO_PATH: 6,  ADD_TO_PATH: 7,  FILL_STROKE_MASK: 3,  ADD_TO_PATH_FLAG: 4};var ImageKind = {  GRAYSCALE_1BPP: 1,  RGB_24BPP: 2,  RGBA_32BPP: 3};var AnnotationType = {  TEXT: 1,  LINK: 2,  FREETEXT: 3,  LINE: 4,  SQUARE: 5,  CIRCLE: 6,  POLYGON: 7,  POLYLINE: 8,  HIGHLIGHT: 9,  UNDERLINE: 10,  SQUIGGLY: 11,  STRIKEOUT: 12,  STAMP: 13,  CARET: 14,  INK: 15,  POPUP: 16,  FILEATTACHMENT: 17,  SOUND: 18,  MOVIE: 19,  WIDGET: 20,  SCREEN: 21,  PRINTERMARK: 22,  TRAPNET: 23,  WATERMARK: 24,  THREED: 25,  REDACT: 26};var AnnotationFlag = {  INVISIBLE: 0x01,  HIDDEN: 0x02,  PRINT: 0x04,  NOZOOM: 0x08,  NOROTATE: 0x10,  NOVIEW: 0x20,  READONLY: 0x40,  LOCKED: 0x80,  TOGGLENOVIEW: 0x100,  LOCKEDCONTENTS: 0x200};var AnnotationBorderStyleType = {  SOLID: 1,  DASHED: 2,  BEVELED: 3,  INSET: 4,  UNDERLINE: 5};var StreamType = {  UNKNOWN: 0,  FLATE: 1,  LZW: 2,  DCT: 3,  JPX: 4,  JBIG: 5,  A85: 6,  AHX: 7,  CCF: 8,  RL: 9};var FontType = {  UNKNOWN: 0,  TYPE1: 1,  TYPE1C: 2,  CIDFONTTYPE0: 3,  CIDFONTTYPE0C: 4,  TRUETYPE: 5,  CIDFONTTYPE2: 6,  TYPE3: 7,  OPENTYPE: 8,  TYPE0: 9,  MMTYPE1: 10};PDFJS.VERBOSITY_LEVELS = {  errors: 0,  warnings: 1,  infos: 5};// All the possible operations for an operator list.var OPS = PDFJS.OPS = {  // Intentionally start from 1 so it is easy to spot bad operators that will be  // 0's.  dependency: 1,  setLineWidth: 2,  setLineCap: 3,  setLineJoin: 4,  setMiterLimit: 5,  setDash: 6,  setRenderingIntent: 7,  setFlatness: 8,  setGState: 9,  save: 10,  restore: 11,  transform: 12,  moveTo: 13,  lineTo: 14,  curveTo: 15,  curveTo2: 16,  curveTo3: 17,  closePath: 18,  rectangle: 19,  stroke: 20,  closeStroke: 21,  fill: 22,  eoFill: 23,  fillStroke: 24,  eoFillStroke: 25,  closeFillStroke: 26,  closeEOFillStroke: 27,  endPath: 28,  clip: 29,  eoClip: 30,  beginText: 31,  endText: 32,  setCharSpacing: 33,  setWordSpacing: 34,  setHScale: 35,  setLeading: 36,  setFont: 37,  setTextRenderingMode: 38,  setTextRise: 39,  moveText: 40,  setLeadingMoveText: 41,  setTextMatrix: 42,  nextLine: 43,  showText: 44,  showSpacedText: 45,  nextLineShowText: 46,  nextLineSetSpacingShowText: 47,  setCharWidth: 48,  setCharWidthAndBounds: 49,  setStrokeColorSpace: 50,  setFillColorSpace: 51,  setStrokeColor: 52,  setStrokeColorN: 53,  setFillColor: 54,  setFillColorN: 55,  setStrokeGray: 56,  setFillGray: 57,  setStrokeRGBColor: 58,  setFillRGBColor: 59,  setStrokeCMYKColor: 60,  setFillCMYKColor: 61,  shadingFill: 62,  beginInlineImage: 63,  beginImageData: 64,  endInlineImage: 65,  paintXObject: 66,  markPoint: 67,  markPointProps: 68,  beginMarkedContent: 69,  beginMarkedContentProps: 70,  endMarkedContent: 71,  beginCompat: 72,  endCompat: 73,  paintFormXObjectBegin: 74,  paintFormXObjectEnd: 75,  beginGroup: 76,  endGroup: 77,  beginAnnotations: 78,  endAnnotations: 79,  beginAnnotation: 80,  endAnnotation: 81,  paintJpegXObject: 82,  paintImageMaskXObject: 83,  paintImageMaskXObjectGroup: 84,  paintImageXObject: 85,  paintInlineImageXObject: 86,  paintInlineImageXObjectGroup: 87,  paintImageXObjectRepeat: 88,  paintImageMaskXObjectRepeat: 89,  paintSolidColorImageMask: 90,  constructPath: 91};// A notice for devs. These are good for things that are helpful to devs, such// as warning that Workers were disabled, which is important to devs but not// end users.function info(msg) {  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {    console.log('Info: ' + msg);  }}// Non-fatal warnings.function warn(msg) {  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {    console.log('Warning: ' + msg);  }}// Deprecated API function -- treated as warnings.function deprecated(details) {  warn('Deprecated API usage: ' + details);}// Fatal errors that should trigger the fallback UI and halt execution by// throwing an exception.function error(msg) {  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) {    console.log('Error: ' + msg);    console.log(backtrace());  }  throw new Error(msg);}function backtrace() {  try {    throw new Error();  } catch (e) {    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';  }}function assert(cond, msg) {  if (!cond) {    error(msg);  }}var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {  unknown: 'unknown',  forms: 'forms',  javaScript: 'javaScript',  smask: 'smask',  shadingPattern: 'shadingPattern',  font: 'font'};// Combines two URLs. The baseUrl shall be absolute URL. If the url is an// absolute URL, it will be returned as is.function combineUrl(baseUrl, url) {  if (!url) {    return baseUrl;  }  return new URL(url, baseUrl).href;}// Validates if URL is safe and allowed, e.g. to avoid XSS.function isValidUrl(url, allowRelative) {  if (!url) {    return false;  }  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)  // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )  var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);  if (!protocol) {    return allowRelative;  }  protocol = protocol[0].toLowerCase();  switch (protocol) {    case 'http':    case 'https':    case 'ftp':    case 'mailto':    case 'tel':      return true;    default:      return false;  }}PDFJS.isValidUrl = isValidUrl;/** * Adds various attributes (href, title, target, rel) to hyperlinks. * @param {HTMLLinkElement} link - The link element. * @param {Object} params - An object with the properties: * @param {string} params.url - An absolute URL. */function addLinkAttributes(link, params) {  var url = params && params.url;  link.href = link.title = (url ? removeNullCharacters(url) : '');  if (url) {    if (isExternalLinkTargetSet()) {      link.target = LinkTargetStringMap[PDFJS.externalLinkTarget];    }    // Strip referrer from the URL.    link.rel = PDFJS.externalLinkRel;  }}PDFJS.addLinkAttributes = addLinkAttributes;function shadow(obj, prop, value) {  Object.defineProperty(obj, prop, { value: value,                                     enumerable: true,                                     configurable: true,                                     writable: false });  return value;}PDFJS.shadow = shadow;var LinkTarget = PDFJS.LinkTarget = {  NONE: 0, // Default value.  SELF: 1,  BLANK: 2,  PARENT: 3,  TOP: 4,};var LinkTargetStringMap = [  '',  '_self',  '_blank',  '_parent',  '_top'];function isExternalLinkTargetSet() {  if (PDFJS.openExternalLinksInNewWindow) {    deprecated('PDFJS.openExternalLinksInNewWindow, please use ' +               '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.');    if (PDFJS.externalLinkTarget === LinkTarget.NONE) {      PDFJS.externalLinkTarget = LinkTarget.BLANK;    }    // Reset the deprecated parameter, to suppress further warnings.    PDFJS.openExternalLinksInNewWindow = false;  }  switch (PDFJS.externalLinkTarget) {    case LinkTarget.NONE:      return false;    case LinkTarget.SELF:    case LinkTarget.BLANK:    case LinkTarget.PARENT:    case LinkTarget.TOP:      return true;  }  warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget);  // Reset the external link target, to suppress further warnings.  PDFJS.externalLinkTarget = LinkTarget.NONE;  return false;}PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet;var PasswordResponses = PDFJS.PasswordResponses = {  NEED_PASSWORD: 1,  INCORRECT_PASSWORD: 2};var PasswordException = (function PasswordExceptionClosure() {  function PasswordException(msg, code) {    this.name = 'PasswordException';    this.message = msg;    this.code = code;  }  PasswordException.prototype = new Error();  PasswordException.constructor = PasswordException;  return PasswordException;})();PDFJS.PasswordException = PasswordException;var UnknownErrorException = (function UnknownErrorExceptionClosure() {  function UnknownErrorException(msg, details) {    this.name = 'UnknownErrorException';    this.message = msg;    this.details = details;  }  UnknownErrorException.prototype = new Error();  UnknownErrorException.constructor = UnknownErrorException;  return UnknownErrorException;})();PDFJS.UnknownErrorException = UnknownErrorException;var InvalidPDFException = (function InvalidPDFExceptionClosure() {  function InvalidPDFException(msg) {    this.name = 'InvalidPDFException';    this.message = msg;  }  InvalidPDFException.prototype = new Error();  InvalidPDFException.constructor = InvalidPDFException;  return InvalidPDFException;})();PDFJS.InvalidPDFException = InvalidPDFException;var MissingPDFException = (function MissingPDFExceptionClosure() {  function MissingPDFException(msg) {    this.name = 'MissingPDFException';    this.message = msg;  }  MissingPDFException.prototype = new Error();  MissingPDFException.constructor = MissingPDFException;  return MissingPDFException;})();PDFJS.MissingPDFException = MissingPDFException;var UnexpectedResponseException =    (function UnexpectedResponseExceptionClosure() {  function UnexpectedResponseException(msg, status) {    this.name = 'UnexpectedResponseException';    this.message = msg;    this.status = status;  }  UnexpectedResponseException.prototype = new Error();  UnexpectedResponseException.constructor = UnexpectedResponseException;  return UnexpectedResponseException;})();PDFJS.UnexpectedResponseException = UnexpectedResponseException;var NotImplementedException = (function NotImplementedExceptionClosure() {  function NotImplementedException(msg) {    this.message = msg;  }  NotImplementedException.prototype = new Error();  NotImplementedException.prototype.name = 'NotImplementedException';  NotImplementedException.constructor = NotImplementedException;  return NotImplementedException;})();var MissingDataException = (function MissingDataExceptionClosure() {  function MissingDataException(begin, end) {    this.begin = begin;    this.end = end;    this.message = 'Missing data [' + begin + ', ' + end + ')';  }  MissingDataException.prototype = new Error();  MissingDataException.prototype.name = 'MissingDataException';  MissingDataException.constructor = MissingDataException;  return MissingDataException;})();var XRefParseException = (function XRefParseExceptionClosure() {  function XRefParseException(msg) {    this.message = msg;  }  XRefParseException.prototype = new Error();  XRefParseException.prototype.name = 'XRefParseException';  XRefParseException.constructor = XRefParseException;  return XRefParseException;})();var NullCharactersRegExp = /\x00/g;function removeNullCharacters(str) {  if (typeof str !== 'string') {    warn('The argument for removeNullCharacters must be a string.');    return str;  }  return str.replace(NullCharactersRegExp, '');}PDFJS.removeNullCharacters = removeNullCharacters;function bytesToString(bytes) {  assert(bytes !== null && typeof bytes === 'object' &&         bytes.length !== undefined, 'Invalid argument for bytesToString');  var length = bytes.length;  var MAX_ARGUMENT_COUNT = 8192;  if (length < MAX_ARGUMENT_COUNT) {    return String.fromCharCode.apply(null, bytes);  }  var strBuf = [];  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);    var chunk = bytes.subarray(i, chunkEnd);    strBuf.push(String.fromCharCode.apply(null, chunk));  }  return strBuf.join('');}function stringToBytes(str) {  assert(typeof str === 'string', 'Invalid argument for stringToBytes');  var length = str.length;  var bytes = new Uint8Array(length);  for (var i = 0; i < length; ++i) {    bytes[i] = str.charCodeAt(i) & 0xFF;  }  return bytes;}function string32(value) {  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,                             (value >> 8) & 0xff, value & 0xff);}function log2(x) {  var n = 1, i = 0;  while (x > n) {    n <<= 1;    i++;  }  return i;}function readInt8(data, start) {  return (data[start] << 24) >> 24;}function readUint16(data, offset) {  return (data[offset] << 8) | data[offset + 1];}function readUint32(data, offset) {  return ((data[offset] << 24) | (data[offset + 1] << 16) |         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;}// Lazy test the endianness of the platform// NOTE: This will be 'true' for simulated TypedArraysfunction isLittleEndian() {  var buffer8 = new Uint8Array(2);  buffer8[0] = 1;  var buffer16 = new Uint16Array(buffer8.buffer);  return (buffer16[0] === 1);}Object.defineProperty(PDFJS, 'isLittleEndian', {  configurable: true,  get: function PDFJS_isLittleEndian() {    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());  }});  // Lazy test if the userAgent support CanvasTypedArraysfunction hasCanvasTypedArrays() {  var canvas = document.createElement('canvas');  canvas.width = canvas.height = 1;  var ctx = canvas.getContext('2d');  var imageData = ctx.createImageData(1, 1);  return (typeof imageData.data.buffer !== 'undefined');}Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {  configurable: true,  get: function PDFJS_hasCanvasTypedArrays() {    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());  }});var Uint32ArrayView = (function Uint32ArrayViewClosure() {  function Uint32ArrayView(buffer, length) {    this.buffer = buffer;    this.byteLength = buffer.length;    this.length = length === undefined ? (this.byteLength >> 2) : length;    ensureUint32ArrayViewProps(this.length);  }  Uint32ArrayView.prototype = Object.create(null);  var uint32ArrayViewSetters = 0;  function createUint32ArrayProp(index) {    return {      get: function () {        var buffer = this.buffer, offset = index << 2;        return (buffer[offset] | (buffer[offset + 1] << 8) |          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;      },      set: function (value) {        var buffer = this.buffer, offset = index << 2;        buffer[offset] = value & 255;        buffer[offset + 1] = (value >> 8) & 255;        buffer[offset + 2] = (value >> 16) & 255;        buffer[offset + 3] = (value >>> 24) & 255;      }    };  }  function ensureUint32ArrayViewProps(length) {    while (uint32ArrayViewSetters < length) {      Object.defineProperty(Uint32ArrayView.prototype,        uint32ArrayViewSetters,        createUint32ArrayProp(uint32ArrayViewSetters));      uint32ArrayViewSetters++;    }  }  return Uint32ArrayView;})();exports.Uint32ArrayView = Uint32ArrayView;var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];var Util = PDFJS.Util = (function UtilClosure() {  function Util() {}  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids  // creating many intermediate strings.  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {    rgbBuf[1] = r;    rgbBuf[3] = g;    rgbBuf[5] = b;    return rgbBuf.join('');  };  // Concatenates two transformation matrices together and returns the result.  Util.transform = function Util_transform(m1, m2) {    return [      m1[0] * m2[0] + m1[2] * m2[1],      m1[1] * m2[0] + m1[3] * m2[1],      m1[0] * m2[2] + m1[2] * m2[3],      m1[1] * m2[2] + m1[3] * m2[3],      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]    ];  };  // For 2d affine transforms  Util.applyTransform = function Util_applyTransform(p, m) {    var xt = p[0] * m[0] + p[1] * m[2] + m[4];    var yt = p[0] * m[1] + p[1] * m[3] + m[5];    return [xt, yt];  };  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {    var d = m[0] * m[3] - m[1] * m[2];    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;    return [xt, yt];  };  // Applies the transform to the rectangle and finds the minimum axially  // aligned bounding box.  Util.getAxialAlignedBoundingBox =    function Util_getAxialAlignedBoundingBox(r, m) {    var p1 = Util.applyTransform(r, m);    var p2 = Util.applyTransform(r.slice(2, 4), m);    var p3 = Util.applyTransform([r[0], r[3]], m);    var p4 = Util.applyTransform([r[2], r[1]], m);    return [      Math.min(p1[0], p2[0], p3[0], p4[0]),      Math.min(p1[1], p2[1], p3[1], p4[1]),      Math.max(p1[0], p2[0], p3[0], p4[0]),      Math.max(p1[1], p2[1], p3[1], p4[1])    ];  };  Util.inverseTransform = function Util_inverseTransform(m) {    var d = m[0] * m[3] - m[1] * m[2];    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];  };  // Apply a generic 3d matrix M on a 3-vector v:  //   | a b c |   | X |  //   | d e f | x | Y |  //   | g h i |   | Z |  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],  // with v as [X,Y,Z]  Util.apply3dTransform = function Util_apply3dTransform(m, v) {    return [      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]    ];  };  // This calculation uses Singular Value Decomposition.  // The SVD can be represented with formula A = USV. We are interested in the  // matrix S here because it represents the scale values.  Util.singularValueDecompose2dScale =    function Util_singularValueDecompose2dScale(m) {    var transpose = [m[0], m[2], m[1], m[3]];    // Multiply matrix m with its transpose.    var a = m[0] * transpose[0] + m[1] * transpose[2];    var b = m[0] * transpose[1] + m[1] * transpose[3];    var c = m[2] * transpose[0] + m[3] * transpose[2];    var d = m[2] * transpose[1] + m[3] * transpose[3];    // Solve the second degree polynomial to get roots.    var first = (a + d) / 2;    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;    var sx = first + second || 1;    var sy = first - second || 1;    // Scale values are the square roots of the eigenvalues.    return [Math.sqrt(sx), Math.sqrt(sy)];  };  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)  // For coordinate systems whose origin lies in the bottom-left, this  // means normalization to (BL,TR) ordering. For systems with origin in the  // top-left, this means (TL,BR) ordering.  Util.normalizeRect = function Util_normalizeRect(rect) {    var r = rect.slice(0); // clone rect    if (rect[0] > rect[2]) {      r[0] = rect[2];      r[2] = rect[0];    }    if (rect[1] > rect[3]) {      r[1] = rect[3];      r[3] = rect[1];    }    return r;  };  // Returns a rectangle [x1, y1, x2, y2] corresponding to the  // intersection of rect1 and rect2. If no intersection, returns 'false'  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]  Util.intersect = function Util_intersect(rect1, rect2) {    function compare(a, b) {      return a - b;    }    // Order points along the axes    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),        result = [];    rect1 = Util.normalizeRect(rect1);    rect2 = Util.normalizeRect(rect2);    // X: first and second points belong to different rectangles?    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {      // Intersection must be between second and third points      result[0] = orderedX[1];      result[2] = orderedX[2];    } else {      return false;    }    // Y: first and second points belong to different rectangles?    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {      // Intersection must be between second and third points      result[1] = orderedY[1];      result[3] = orderedY[2];    } else {      return false;    }    return result;  };  Util.sign = function Util_sign(num) {    return num < 0 ? -1 : 1;  };  var ROMAN_NUMBER_MAP = [    '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM',    '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC',    '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'  ];  /**   * Converts positive integers to (upper case) Roman numerals.   * @param {integer} number - The number that should be converted.   * @param {boolean} lowerCase - Indicates if the result should be converted   *   to lower case letters. The default is false.   * @return {string} The resulting Roman number.   */  Util.toRoman = function Util_toRoman(number, lowerCase) {    assert(isInt(number) && number > 0,           'The number should be a positive integer.');    var pos, romanBuf = [];    // Thousands    while (number >= 1000) {      number -= 1000;      romanBuf.push('M');    }    // Hundreds    pos = (number / 100) | 0;    number %= 100;    romanBuf.push(ROMAN_NUMBER_MAP[pos]);    // Tens    pos = (number / 10) | 0;    number %= 10;    romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);    // Ones    romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);    var romanStr = romanBuf.join('');    return (lowerCase ? romanStr.toLowerCase() : romanStr);  };  Util.appendToArray = function Util_appendToArray(arr1, arr2) {    Array.prototype.push.apply(arr1, arr2);  };  Util.prependToArray = function Util_prependToArray(arr1, arr2) {    Array.prototype.unshift.apply(arr1, arr2);  };  Util.extendObj = function extendObj(obj1, obj2) {    for (var key in obj2) {      obj1[key] = obj2[key];    }  };  Util.getInheritableProperty = function Util_getInheritableProperty(dict,                                                                     name) {    while (dict && !dict.has(name)) {      dict = dict.get('Parent');    }    if (!dict) {      return null;    }    return dict.get(name);  };  Util.inherit = function Util_inherit(sub, base, prototype) {    sub.prototype = Object.create(base.prototype);    sub.prototype.constructor = sub;    for (var prop in prototype) {      sub.prototype[prop] = prototype[prop];    }  };  Util.loadScript = function Util_loadScript(src, callback) {    var script = document.createElement('script');    var loaded = false;    script.setAttribute('src', src);    if (callback) {      script.onload = function() {        if (!loaded) {          callback();        }        loaded = true;      };    }    document.getElementsByTagName('head')[0].appendChild(script);  };  return Util;})();/** * PDF page viewport created based on scale, rotation and offset. * @class * @alias PDFJS.PageViewport */var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {  /**   * @constructor   * @private   * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.   * @param scale {number} scale of the viewport.   * @param rotation {number} rotations of the viewport in degrees.   * @param offsetX {number} offset X   * @param offsetY {number} offset Y   * @param dontFlip {boolean} if true, axis Y will not be flipped.   */  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {    this.viewBox = viewBox;    this.scale = scale;    this.rotation = rotation;    this.offsetX = offsetX;    this.offsetY = offsetY;    // creating transform to convert pdf coordinate system to the normal    // canvas like coordinates taking in account scale and rotation    var centerX = (viewBox[2] + viewBox[0]) / 2;    var centerY = (viewBox[3] + viewBox[1]) / 2;    var rotateA, rotateB, rotateC, rotateD;    rotation = rotation % 360;    rotation = rotation < 0 ? rotation + 360 : rotation;    switch (rotation) {      case 180:        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;        break;      case 90:        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;        break;      case 270:        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;        break;      //case 0:      default:        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;        break;    }    if (dontFlip) {      rotateC = -rotateC; rotateD = -rotateD;    }    var offsetCanvasX, offsetCanvasY;    var width, height;    if (rotateA === 0) {      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;      width = Math.abs(viewBox[3] - viewBox[1]) * scale;      height = Math.abs(viewBox[2] - viewBox[0]) * scale;    } else {      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;      width = Math.abs(viewBox[2] - viewBox[0]) * scale;      height = Math.abs(viewBox[3] - viewBox[1]) * scale;    }    // creating transform for the following operations:    // translate(-centerX, -centerY), rotate and flip vertically,    // scale, and translate(offsetCanvasX, offsetCanvasY)    this.transform = [      rotateA * scale,      rotateB * scale,      rotateC * scale,      rotateD * scale,      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY    ];    this.width = width;    this.height = height;    this.fontScale = scale;  }  PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {    /**     * Clones viewport with additional properties.     * @param args {Object} (optional) If specified, may contain the 'scale' or     * 'rotation' properties to override the corresponding properties in     * the cloned viewport.     * @returns {PDFJS.PageViewport} Cloned viewport.     */    clone: function PageViewPort_clone(args) {      args = args || {};      var scale = 'scale' in args ? args.scale : this.scale;      var rotation = 'rotation' in args ? args.rotation : this.rotation;      return new PageViewport(this.viewBox.slice(), scale, rotation,                              this.offsetX, this.offsetY, args.dontFlip);    },    /**     * Converts PDF point to the viewport coordinates. For examples, useful for     * converting PDF location into canvas pixel coordinates.     * @param x {number} X coordinate.     * @param y {number} Y coordinate.     * @returns {Object} Object that contains 'x' and 'y' properties of the     * point in the viewport coordinate space.     * @see {@link convertToPdfPoint}     * @see {@link convertToViewportRectangle}     */    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {      return Util.applyTransform([x, y], this.transform);    },    /**     * Converts PDF rectangle to the viewport coordinates.     * @param rect {Array} xMin, yMin, xMax and yMax coordinates.     * @returns {Array} Contains corresponding coordinates of the rectangle     * in the viewport coordinate space.     * @see {@link convertToViewportPoint}     */    convertToViewportRectangle:      function PageViewport_convertToViewportRectangle(rect) {      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);      var br = Util.applyTransform([rect[2], rect[3]], this.transform);      return [tl[0], tl[1], br[0], br[1]];    },    /**     * Converts viewport coordinates to the PDF location. For examples, useful     * for converting canvas pixel location into PDF one.     * @param x {number} X coordinate.     * @param y {number} Y coordinate.     * @returns {Object} Object that contains 'x' and 'y' properties of the     * point in the PDF coordinate space.     * @see {@link convertToViewportPoint}     */    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {      return Util.applyInverseTransform([x, y], this.transform);    }  };  return PageViewport;})();var PDFStringTranslateTable = [  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];function stringToPDFString(str) {  var i, n = str.length, strBuf = [];  if (str[0] === '\xFE' && str[1] === '\xFF') {    // UTF16BE BOM    for (i = 2; i < n; i += 2) {      strBuf.push(String.fromCharCode(        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));    }  } else {    for (i = 0; i < n; ++i) {      var code = PDFStringTranslateTable[str.charCodeAt(i)];      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));    }  }  return strBuf.join('');}function stringToUTF8String(str) {  return decodeURIComponent(escape(str));}function utf8StringToString(str) {  return unescape(encodeURIComponent(str));}function isEmptyObj(obj) {  for (var key in obj) {    return false;  }  return true;}function isBool(v) {  return typeof v === 'boolean';}function isInt(v) {  return typeof v === 'number' && ((v | 0) === v);}function isNum(v) {  return typeof v === 'number';}function isString(v) {  return typeof v === 'string';}function isArray(v) {  return v instanceof Array;}function isArrayBuffer(v) {  return typeof v === 'object' && v !== null && v.byteLength !== undefined;}/** * Promise Capability object. * * @typedef {Object} PromiseCapability * @property {Promise} promise - A promise object. * @property {function} resolve - Fullfills the promise. * @property {function} reject - Rejects the promise. *//** * Creates a promise capability object. * @alias PDFJS.createPromiseCapability * * @return {PromiseCapability} A capability object contains: * - a Promise, resolve and reject methods. */function createPromiseCapability() {  var capability = {};  capability.promise = new Promise(function (resolve, reject) {    capability.resolve = resolve;    capability.reject = reject;  });  return capability;}PDFJS.createPromiseCapability = createPromiseCapability;/** * Polyfill for Promises: * The following promise implementation tries to generally implement the * Promise/A+ spec. Some notable differences from other promise libaries are: * - There currently isn't a seperate deferred and promise object. * - Unhandled rejections eventually show an error if they aren't handled. * * Based off of the work in: * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 */(function PromiseClosure() {  if (globalScope.Promise) {    // Promises existing in the DOM/Worker, checking presence of all/resolve    if (typeof globalScope.Promise.all !== 'function') {      globalScope.Promise.all = function (iterable) {        var count = 0, results = [], resolve, reject;        var promise = new globalScope.Promise(function (resolve_, reject_) {          resolve = resolve_;          reject = reject_;        });        iterable.forEach(function (p, i) {          count++;          p.then(function (result) {            results[i] = result;            count--;            if (count === 0) {              resolve(results);            }          }, reject);        });        if (count === 0) {          resolve(results);        }        return promise;      };    }    if (typeof globalScope.Promise.resolve !== 'function') {      globalScope.Promise.resolve = function (value) {        return new globalScope.Promise(function (resolve) { resolve(value); });      };    }    if (typeof globalScope.Promise.reject !== 'function') {      globalScope.Promise.reject = function (reason) {        return new globalScope.Promise(function (resolve, reject) {          reject(reason);        });      };    }    if (typeof globalScope.Promise.prototype.catch !== 'function') {      globalScope.Promise.prototype.catch = function (onReject) {        return globalScope.Promise.prototype.then(undefined, onReject);      };    }    return;  }  var STATUS_PENDING = 0;  var STATUS_RESOLVED = 1;  var STATUS_REJECTED = 2;  // In an attempt to avoid silent exceptions, unhandled rejections are  // tracked and if they aren't handled in a certain amount of time an  // error is logged.  var REJECTION_TIMEOUT = 500;  var HandlerManager = {    handlers: [],    running: false,    unhandledRejections: [],    pendingRejectionCheck: false,    scheduleHandlers: function scheduleHandlers(promise) {      if (promise._status === STATUS_PENDING) {        return;      }      this.handlers = this.handlers.concat(promise._handlers);      promise._handlers = [];      if (this.running) {        return;      }      this.running = true;      setTimeout(this.runHandlers.bind(this), 0);    },    runHandlers: function runHandlers() {      var RUN_TIMEOUT = 1; // ms      var timeoutAt = Date.now() + RUN_TIMEOUT;      while (this.handlers.length > 0) {        var handler = this.handlers.shift();        var nextStatus = handler.thisPromise._status;        var nextValue = handler.thisPromise._value;        try {          if (nextStatus === STATUS_RESOLVED) {            if (typeof handler.onResolve === 'function') {              nextValue = handler.onResolve(nextValue);            }          } else if (typeof handler.onReject === 'function') {              nextValue = handler.onReject(nextValue);              nextStatus = STATUS_RESOLVED;              if (handler.thisPromise._unhandledRejection) {                this.removeUnhandeledRejection(handler.thisPromise);              }          }        } catch (ex) {          nextStatus = STATUS_REJECTED;          nextValue = ex;        }        handler.nextPromise._updateStatus(nextStatus, nextValue);        if (Date.now() >= timeoutAt) {          break;        }      }      if (this.handlers.length > 0) {        setTimeout(this.runHandlers.bind(this), 0);        return;      }      this.running = false;    },    addUnhandledRejection: function addUnhandledRejection(promise) {      this.unhandledRejections.push({        promise: promise,        time: Date.now()      });      this.scheduleRejectionCheck();    },    removeUnhandeledRejection: function removeUnhandeledRejection(promise) {      promise._unhandledRejection = false;      for (var i = 0; i < this.unhandledRejections.length; i++) {        if (this.unhandledRejections[i].promise === promise) {          this.unhandledRejections.splice(i);          i--;        }      }    },    scheduleRejectionCheck: function scheduleRejectionCheck() {      if (this.pendingRejectionCheck) {        return;      }      this.pendingRejectionCheck = true;      setTimeout(function rejectionCheck() {        this.pendingRejectionCheck = false;        var now = Date.now();        for (var i = 0; i < this.unhandledRejections.length; i++) {          if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {            var unhandled = this.unhandledRejections[i].promise._value;            var msg = 'Unhandled rejection: ' + unhandled;            if (unhandled.stack) {              msg += '\n' + unhandled.stack;            }            warn(msg);            this.unhandledRejections.splice(i);            i--;          }        }        if (this.unhandledRejections.length) {          this.scheduleRejectionCheck();        }      }.bind(this), REJECTION_TIMEOUT);    }  };  function Promise(resolver) {    this._status = STATUS_PENDING;    this._handlers = [];    try {      resolver.call(this, this._resolve.bind(this), this._reject.bind(this));    } catch (e) {      this._reject(e);    }  }  /**   * Builds a promise that is resolved when all the passed in promises are   * resolved.   * @param {array} array of data and/or promises to wait for.   * @return {Promise} New dependant promise.   */  Promise.all = function Promise_all(promises) {    var resolveAll, rejectAll;    var deferred = new Promise(function (resolve, reject) {      resolveAll = resolve;      rejectAll = reject;    });    var unresolved = promises.length;    var results = [];    if (unresolved === 0) {      resolveAll(results);      return deferred;    }    function reject(reason) {      if (deferred._status === STATUS_REJECTED) {        return;      }      results = [];      rejectAll(reason);    }    for (var i = 0, ii = promises.length; i < ii; ++i) {      var promise = promises[i];      var resolve = (function(i) {        return function(value) {          if (deferred._status === STATUS_REJECTED) {            return;          }          results[i] = value;          unresolved--;          if (unresolved === 0) {            resolveAll(results);          }        };      })(i);      if (Promise.isPromise(promise)) {        promise.then(resolve, reject);      } else {        resolve(promise);      }    }    return deferred;  };  /**   * Checks if the value is likely a promise (has a 'then' function).   * @return {boolean} true if value is thenable   */  Promise.isPromise = function Promise_isPromise(value) {    return value && typeof value.then === 'function';  };  /**   * Creates resolved promise   * @param value resolve value   * @returns {Promise}   */  Promise.resolve = function Promise_resolve(value) {    return new Promise(function (resolve) { resolve(value); });  };  /**   * Creates rejected promise   * @param reason rejection value   * @returns {Promise}   */  Promise.reject = function Promise_reject(reason) {    return new Promise(function (resolve, reject) { reject(reason); });  };  Promise.prototype = {    _status: null,    _value: null,    _handlers: null,    _unhandledRejection: null,    _updateStatus: function Promise__updateStatus(status, value) {      if (this._status === STATUS_RESOLVED ||          this._status === STATUS_REJECTED) {        return;      }      if (status === STATUS_RESOLVED &&          Promise.isPromise(value)) {        value.then(this._updateStatus.bind(this, STATUS_RESOLVED),                   this._updateStatus.bind(this, STATUS_REJECTED));        return;      }      this._status = status;      this._value = value;      if (status === STATUS_REJECTED && this._handlers.length === 0) {        this._unhandledRejection = true;        HandlerManager.addUnhandledRejection(this);      }      HandlerManager.scheduleHandlers(this);    },    _resolve: function Promise_resolve(value) {      this._updateStatus(STATUS_RESOLVED, value);    },    _reject: function Promise_reject(reason) {      this._updateStatus(STATUS_REJECTED, reason);    },    then: function Promise_then(onResolve, onReject) {      var nextPromise = new Promise(function (resolve, reject) {        this.resolve = resolve;        this.reject = reject;      });      this._handlers.push({        thisPromise: this,        onResolve: onResolve,        onReject: onReject,        nextPromise: nextPromise      });      HandlerManager.scheduleHandlers(this);      return nextPromise;    },    catch: function Promise_catch(onReject) {      return this.then(undefined, onReject);    }  };  globalScope.Promise = Promise;})();var StatTimer = (function StatTimerClosure() {  function rpad(str, pad, length) {    while (str.length < length) {      str += pad;    }    return str;  }  function StatTimer() {    this.started = {};    this.times = [];    this.enabled = true;  }  StatTimer.prototype = {    time: function StatTimer_time(name) {      if (!this.enabled) {        return;      }      if (name in this.started) {        warn('Timer is already running for ' + name);      }      this.started[name] = Date.now();    },    timeEnd: function StatTimer_timeEnd(name) {      if (!this.enabled) {        return;      }      if (!(name in this.started)) {        warn('Timer has not been started for ' + name);      }      this.times.push({        'name': name,        'start': this.started[name],        'end': Date.now()      });      // Remove timer from started so it can be called again.      delete this.started[name];    },    toString: function StatTimer_toString() {      var i, ii;      var times = this.times;      var out = '';      // Find the longest name for padding purposes.      var longest = 0;      for (i = 0, ii = times.length; i < ii; ++i) {        var name = times[i]['name'];        if (name.length > longest) {          longest = name.length;        }      }      for (i = 0, ii = times.length; i < ii; ++i) {        var span = times[i];        var duration = span.end - span.start;        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';      }      return out;    }  };  return StatTimer;})();PDFJS.createBlob = function createBlob(data, contentType) {  if (typeof Blob !== 'undefined') {    return new Blob([data], { type: contentType });  }  // Blob builder is deprecated in FF14 and removed in FF18.  var bb = new MozBlobBuilder();  bb.append(data);  return bb.getBlob(contentType);};PDFJS.createObjectURL = (function createObjectURLClosure() {  // Blob/createObjectURL is not available, falling back to data schema.  var digits =    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';  return function createObjectURL(data, contentType) {    if (!PDFJS.disableCreateObjectURL &&        typeof URL !== 'undefined' && URL.createObjectURL) {      var blob = PDFJS.createBlob(data, contentType);      return URL.createObjectURL(blob);    }    var buffer = 'data:' + contentType + ';base64,';    for (var i = 0, ii = data.length; i < ii; i += 3) {      var b1 = data[i] & 0xFF;      var b2 = data[i + 1] & 0xFF;      var b3 = data[i + 2] & 0xFF;      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];    }    return buffer;  };})();function MessageHandler(sourceName, targetName, comObj) {  this.sourceName = sourceName;  this.targetName = targetName;  this.comObj = comObj;  this.callbackIndex = 1;  this.postMessageTransfers = true;  var callbacksCapabilities = this.callbacksCapabilities = {};  var ah = this.actionHandler = {};  this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) {    var data = event.data;    if (data.targetName !== this.sourceName) {      return;    }    if (data.isReply) {      var callbackId = data.callbackId;      if (data.callbackId in callbacksCapabilities) {        var callback = callbacksCapabilities[callbackId];        delete callbacksCapabilities[callbackId];        if ('error' in data) {          callback.reject(data.error);        } else {          callback.resolve(data.data);        }      } else {        error('Cannot resolve callback ' + callbackId);      }    } else if (data.action in ah) {      var action = ah[data.action];      if (data.callbackId) {        var sourceName = this.sourceName;        var targetName = data.sourceName;        Promise.resolve().then(function () {          return action[0].call(action[1], data.data);        }).then(function (result) {          comObj.postMessage({            sourceName: sourceName,            targetName: targetName,            isReply: true,            callbackId: data.callbackId,            data: result          });        }, function (reason) {          if (reason instanceof Error) {            // Serialize error to avoid "DataCloneError"            reason = reason + '';          }          comObj.postMessage({            sourceName: sourceName,            targetName: targetName,            isReply: true,            callbackId: data.callbackId,            error: reason          });        });      } else {        action[0].call(action[1], data.data);      }    } else {      error('Unknown action from worker: ' + data.action);    }  }.bind(this);  comObj.addEventListener('message', this._onComObjOnMessage);}MessageHandler.prototype = {  on: function messageHandlerOn(actionName, handler, scope) {    var ah = this.actionHandler;    if (ah[actionName]) {      error('There is already an actionName called "' + actionName + '"');    }    ah[actionName] = [handler, scope];  },  /**   * Sends a message to the comObj to invoke the action with the supplied data.   * @param {String} actionName Action to call.   * @param {JSON} data JSON data to send.   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers   */  send: function messageHandlerSend(actionName, data, transfers) {    var message = {      sourceName: this.sourceName,      targetName: this.targetName,      action: actionName,      data: data    };    this.postMessage(message, transfers);  },  /**   * Sends a message to the comObj to invoke the action with the supplied data.   * Expects that other side will callback with the response.   * @param {String} actionName Action to call.   * @param {JSON} data JSON data to send.   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers.   * @returns {Promise} Promise to be resolved with response data.   */  sendWithPromise:    function messageHandlerSendWithPromise(actionName, data, transfers) {    var callbackId = this.callbackIndex++;    var message = {      sourceName: this.sourceName,      targetName: this.targetName,      action: actionName,      data: data,      callbackId: callbackId    };    var capability = createPromiseCapability();    this.callbacksCapabilities[callbackId] = capability;    try {      this.postMessage(message, transfers);    } catch (e) {      capability.reject(e);    }    return capability.promise;  },  /**   * Sends raw message to the comObj.   * @private   * @param message {Object} Raw message.   * @param transfers List of transfers/ArrayBuffers, or undefined.   */  postMessage: function (message, transfers) {    if (transfers && this.postMessageTransfers) {      this.comObj.postMessage(message, transfers);    } else {      this.comObj.postMessage(message);    }  },  destroy: function () {    this.comObj.removeEventListener('message', this._onComObjOnMessage);  }};function loadJpegStream(id, imageUrl, objs) {  var img = new Image();  img.onload = (function loadJpegStream_onloadClosure() {    objs.resolve(id, img);  });  img.onerror = (function loadJpegStream_onerrorClosure() {    objs.resolve(id, null);    warn('Error during JPEG image loading');  });  img.src = imageUrl;}  // Polyfill from https://github.com/Polymer/URL/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */(function checkURLConstructor(scope) {  /* jshint ignore:start */  // feature detect for URL constructor  var hasWorkingUrl = false;  try {    if (typeof URL === 'function' &&        typeof URL.prototype === 'object' &&        ('origin' in URL.prototype)) {      var u = new URL('b', 'http://a');      u.pathname = 'c%20d';      hasWorkingUrl = u.href === 'http://a/c%20d';    }  } catch(e) { }  if (hasWorkingUrl)    return;  var relative = Object.create(null);  relative['ftp'] = 21;  relative['file'] = 0;  relative['gopher'] = 70;  relative['http'] = 80;  relative['https'] = 443;  relative['ws'] = 80;  relative['wss'] = 443;  var relativePathDotMapping = Object.create(null);  relativePathDotMapping['%2e'] = '.';  relativePathDotMapping['.%2e'] = '..';  relativePathDotMapping['%2e.'] = '..';  relativePathDotMapping['%2e%2e'] = '..';  function isRelativeScheme(scheme) {    return relative[scheme] !== undefined;  }  function invalid() {    clear.call(this);    this._isInvalid = true;  }  function IDNAToASCII(h) {    if ('' == h) {      invalid.call(this)    }    // XXX    return h.toLowerCase()  }  function percentEscape(c) {    var unicode = c.charCodeAt(0);    if (unicode > 0x20 &&       unicode < 0x7F &&       // " # < > ? `       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1      ) {      return c;    }    return encodeURIComponent(c);  }  function percentEscapeQuery(c) {    // XXX This actually needs to encode c using encoding and then    // convert the bytes one-by-one.    var unicode = c.charCodeAt(0);    if (unicode > 0x20 &&       unicode < 0x7F &&       // " # < > ` (do not escape '?')       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1      ) {      return c;    }    return encodeURIComponent(c);  }  var EOF = undefined,      ALPHA = /[a-zA-Z]/,      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;  function parse(input, stateOverride, base) {    function err(message) {      errors.push(message)    }    var state = stateOverride || 'scheme start',        cursor = 0,        buffer = '',        seenAt = false,        seenBracket = false,        errors = [];    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {      var c = input[cursor];      switch (state) {        case 'scheme start':          if (c && ALPHA.test(c)) {            buffer += c.toLowerCase(); // ASCII-safe            state = 'scheme';          } else if (!stateOverride) {            buffer = '';            state = 'no scheme';            continue;          } else {            err('Invalid scheme.');            break loop;          }          break;        case 'scheme':          if (c && ALPHANUMERIC.test(c)) {            buffer += c.toLowerCase(); // ASCII-safe          } else if (':' == c) {            this._scheme = buffer;            buffer = '';            if (stateOverride) {              break loop;            }            if (isRelativeScheme(this._scheme)) {              this._isRelative = true;            }            if ('file' == this._scheme) {              state = 'relative';            } else if (this._isRelative && base && base._scheme == this._scheme) {              state = 'relative or authority';            } else if (this._isRelative) {              state = 'authority first slash';            } else {              state = 'scheme data';            }          } else if (!stateOverride) {            buffer = '';            cursor = 0;            state = 'no scheme';            continue;          } else if (EOF == c) {            break loop;          } else {            err('Code point not allowed in scheme: ' + c)            break loop;          }          break;        case 'scheme data':          if ('?' == c) {            this._query = '?';            state = 'query';          } else if ('#' == c) {            this._fragment = '#';            state = 'fragment';          } else {            // XXX error handling            if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {              this._schemeData += percentEscape(c);            }          }          break;        case 'no scheme':          if (!base || !(isRelativeScheme(base._scheme))) {            err('Missing scheme.');            invalid.call(this);          } else {            state = 'relative';            continue;          }          break;        case 'relative or authority':          if ('/' == c && '/' == input[cursor+1]) {            state = 'authority ignore slashes';          } else {            err('Expected /, got: ' + c);            state = 'relative';            continue          }          break;        case 'relative':          this._isRelative = true;          if ('file' != this._scheme)            this._scheme = base._scheme;          if (EOF == c) {            this._host = base._host;            this._port = base._port;            this._path = base._path.slice();            this._query = base._query;            this._username = base._username;            this._password = base._password;            break loop;          } else if ('/' == c || '\\' == c) {            if ('\\' == c)              err('\\ is an invalid code point.');            state = 'relative slash';          } else if ('?' == c) {            this._host = base._host;            this._port = base._port;            this._path = base._path.slice();            this._query = '?';            this._username = base._username;            this._password = base._password;            state = 'query';          } else if ('#' == c) {            this._host = base._host;            this._port = base._port;            this._path = base._path.slice();            this._query = base._query;            this._fragment = '#';            this._username = base._username;            this._password = base._password;            state = 'fragment';          } else {            var nextC = input[cursor+1]            var nextNextC = input[cursor+2]            if (              'file' != this._scheme || !ALPHA.test(c) ||              (nextC != ':' && nextC != '|') ||              (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {              this._host = base._host;              this._port = base._port;              this._username = base._username;              this._password = base._password;              this._path = base._path.slice();              this._path.pop();            }            state = 'relative path';            continue;          }          break;        case 'relative slash':          if ('/' == c || '\\' == c) {            if ('\\' == c) {              err('\\ is an invalid code point.');            }            if ('file' == this._scheme) {              state = 'file host';            } else {              state = 'authority ignore slashes';            }          } else {            if ('file' != this._scheme) {              this._host = base._host;              this._port = base._port;              this._username = base._username;              this._password = base._password;            }            state = 'relative path';            continue;          }          break;        case 'authority first slash':          if ('/' == c) {            state = 'authority second slash';          } else {            err("Expected '/', got: " + c);            state = 'authority ignore slashes';            continue;          }          break;        case 'authority second slash':          state = 'authority ignore slashes';          if ('/' != c) {            err("Expected '/', got: " + c);            continue;          }          break;        case 'authority ignore slashes':          if ('/' != c && '\\' != c) {            state = 'authority';            continue;          } else {            err('Expected authority, got: ' + c);          }          break;        case 'authority':          if ('@' == c) {            if (seenAt) {              err('@ already seen.');              buffer += '%40';            }            seenAt = true;            for (var i = 0; i < buffer.length; i++) {              var cp = buffer[i];              if ('\t' == cp || '\n' == cp || '\r' == cp) {                err('Invalid whitespace in authority.');                continue;              }              // XXX check URL code points              if (':' == cp && null === this._password) {                this._password = '';                continue;              }              var tempC = percentEscape(cp);              (null !== this._password) ? this._password += tempC : this._username += tempC;            }            buffer = '';          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {            cursor -= buffer.length;            buffer = '';            state = 'host';            continue;          } else {            buffer += c;          }          break;        case 'file host':          if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {              state = 'relative path';            } else if (buffer.length == 0) {              state = 'relative path start';            } else {              this._host = IDNAToASCII.call(this, buffer);              buffer = '';              state = 'relative path start';            }            continue;          } else if ('\t' == c || '\n' == c || '\r' == c) {            err('Invalid whitespace in file host.');          } else {            buffer += c;          }          break;        case 'host':        case 'hostname':          if (':' == c && !seenBracket) {            // XXX host parsing            this._host = IDNAToASCII.call(this, buffer);            buffer = '';            state = 'port';            if ('hostname' == stateOverride) {              break loop;            }          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {            this._host = IDNAToASCII.call(this, buffer);            buffer = '';            state = 'relative path start';            if (stateOverride) {              break loop;            }            continue;          } else if ('\t' != c && '\n' != c && '\r' != c) {            if ('[' == c) {              seenBracket = true;            } else if (']' == c) {              seenBracket = false;            }            buffer += c;          } else {            err('Invalid code point in host/hostname: ' + c);          }          break;        case 'port':          if (/[0-9]/.test(c)) {            buffer += c;          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {            if ('' != buffer) {              var temp = parseInt(buffer, 10);              if (temp != relative[this._scheme]) {                this._port = temp + '';              }              buffer = '';            }            if (stateOverride) {              break loop;            }            state = 'relative path start';            continue;          } else if ('\t' == c || '\n' == c || '\r' == c) {            err('Invalid code point in port: ' + c);          } else {            invalid.call(this);          }          break;        case 'relative path start':          if ('\\' == c)            err("'\\' not allowed in path.");          state = 'relative path';          if ('/' != c && '\\' != c) {            continue;          }          break;        case 'relative path':          if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) {            if ('\\' == c) {              err('\\ not allowed in relative path.');            }            var tmp;            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {              buffer = tmp;            }            if ('..' == buffer) {              this._path.pop();              if ('/' != c && '\\' != c) {                this._path.push('');              }            } else if ('.' == buffer && '/' != c && '\\' != c) {              this._path.push('');            } else if ('.' != buffer) {              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {                buffer = buffer[0] + ':';              }              this._path.push(buffer);            }            buffer = '';            if ('?' == c) {              this._query = '?';              state = 'query';            } else if ('#' == c) {              this._fragment = '#';              state = 'fragment';            }          } else if ('\t' != c && '\n' != c && '\r' != c) {            buffer += percentEscape(c);          }          break;        case 'query':          if (!stateOverride && '#' == c) {            this._fragment = '#';            state = 'fragment';          } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {            this._query += percentEscapeQuery(c);          }          break;        case 'fragment':          if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {            this._fragment += c;          }          break;      }      cursor++;    }  }  function clear() {    this._scheme = '';    this._schemeData = '';    this._username = '';    this._password = null;    this._host = '';    this._port = '';    this._path = [];    this._query = '';    this._fragment = '';    this._isInvalid = false;    this._isRelative = false;  }  // Does not process domain names or IP addresses.  // Does not handle encoding for the query parameter.  function jURL(url, base /* , encoding */) {    if (base !== undefined && !(base instanceof jURL))      base = new jURL(String(base));    this._url = url;    clear.call(this);    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');    // encoding = encoding || 'utf-8'    parse.call(this, input, null, base);  }  jURL.prototype = {    toString: function() {      return this.href;    },    get href() {      if (this._isInvalid)        return this._url;      var authority = '';      if ('' != this._username || null != this._password) {        authority = this._username +            (null != this._password ? ':' + this._password : '') + '@';      }      return this.protocol +          (this._isRelative ? '//' + authority + this.host : '') +          this.pathname + this._query + this._fragment;    },    set href(href) {      clear.call(this);      parse.call(this, href);    },    get protocol() {      return this._scheme + ':';    },    set protocol(protocol) {      if (this._isInvalid)        return;      parse.call(this, protocol + ':', 'scheme start');    },    get host() {      return this._isInvalid ? '' : this._port ?          this._host + ':' + this._port : this._host;    },    set host(host) {      if (this._isInvalid || !this._isRelative)        return;      parse.call(this, host, 'host');    },    get hostname() {      return this._host;    },    set hostname(hostname) {      if (this._isInvalid || !this._isRelative)        return;      parse.call(this, hostname, 'hostname');    },    get port() {      return this._port;    },    set port(port) {      if (this._isInvalid || !this._isRelative)        return;      parse.call(this, port, 'port');    },    get pathname() {      return this._isInvalid ? '' : this._isRelative ?          '/' + this._path.join('/') : this._schemeData;    },    set pathname(pathname) {      if (this._isInvalid || !this._isRelative)        return;      this._path = [];      parse.call(this, pathname, 'relative path start');    },    get search() {      return this._isInvalid || !this._query || '?' == this._query ?          '' : this._query;    },    set search(search) {      if (this._isInvalid || !this._isRelative)        return;      this._query = '?';      if ('?' == search[0])        search = search.slice(1);      parse.call(this, search, 'query');    },    get hash() {      return this._isInvalid || !this._fragment || '#' == this._fragment ?          '' : this._fragment;    },    set hash(hash) {      if (this._isInvalid)        return;      this._fragment = '#';      if ('#' == hash[0])        hash = hash.slice(1);      parse.call(this, hash, 'fragment');    },    get origin() {      var host;      if (this._isInvalid || !this._scheme) {        return '';      }      // javascript: Gecko returns String(""), WebKit/Blink String("null")      // Gecko throws error for "data://"      // data: Gecko returns "", Blink returns "data://", WebKit returns "null"      // Gecko returns String("") for file: mailto:      // WebKit/Blink returns String("SCHEME://") for file: mailto:      switch (this._scheme) {        case 'data':        case 'file':        case 'javascript':        case 'mailto':          return 'null';      }      host = this.host;      if (!host) {        return '';      }      return this._scheme + '://' + host;    }  };  // Copy over the static methods  var OriginalURL = scope.URL;  if (OriginalURL) {    jURL.createObjectURL = function(blob) {      // IE extension allows a second optional options argument.      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);    };    jURL.revokeObjectURL = function(url) {      OriginalURL.revokeObjectURL(url);    };  }  scope.URL = jURL;  /* jshint ignore:end */})(globalScope);exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;exports.IDENTITY_MATRIX = IDENTITY_MATRIX;exports.OPS = OPS;exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;exports.AnnotationBorderStyleType = AnnotationBorderStyleType;exports.AnnotationFlag = AnnotationFlag;exports.AnnotationType = AnnotationType;exports.FontType = FontType;exports.ImageKind = ImageKind;exports.InvalidPDFException = InvalidPDFException;exports.LinkTarget = LinkTarget;exports.LinkTargetStringMap = LinkTargetStringMap;exports.MessageHandler = MessageHandler;exports.MissingDataException = MissingDataException;exports.MissingPDFException = MissingPDFException;exports.NotImplementedException = NotImplementedException;exports.PasswordException = PasswordException;exports.PasswordResponses = PasswordResponses;exports.StatTimer = StatTimer;exports.StreamType = StreamType;exports.TextRenderingMode = TextRenderingMode;exports.UnexpectedResponseException = UnexpectedResponseException;exports.UnknownErrorException = UnknownErrorException;exports.Util = Util;exports.XRefParseException = XRefParseException;exports.assert = assert;exports.bytesToString = bytesToString;exports.combineUrl = combineUrl;exports.createPromiseCapability = createPromiseCapability;exports.deprecated = deprecated;exports.error = error;exports.info = info;exports.isArray = isArray;exports.isArrayBuffer = isArrayBuffer;exports.isBool = isBool;exports.isEmptyObj = isEmptyObj;exports.isExternalLinkTargetSet = isExternalLinkTargetSet;exports.isInt = isInt;exports.isNum = isNum;exports.isString = isString;exports.isValidUrl = isValidUrl;exports.addLinkAttributes = addLinkAttributes;exports.loadJpegStream = loadJpegStream;exports.log2 = log2;exports.readInt8 = readInt8;exports.readUint16 = readUint16;exports.readUint32 = readUint32;exports.removeNullCharacters = removeNullCharacters;exports.shadow = shadow;exports.string32 = string32;exports.stringToBytes = stringToBytes;exports.stringToPDFString = stringToPDFString;exports.stringToUTF8String = stringToUTF8String;exports.utf8StringToString = utf8StringToString;exports.warn = warn;}));(function (root, factory) {  {    factory((root.pdfjsDisplayAnnotationLayer = {}), root.pdfjsSharedUtil,      root.pdfjsDisplayDOMUtils);  }}(this, function (exports, sharedUtil, displayDOMUtils) {var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType;var AnnotationType = sharedUtil.AnnotationType;var Util = sharedUtil.Util;var addLinkAttributes = sharedUtil.addLinkAttributes;var warn = sharedUtil.warn;var CustomStyle = displayDOMUtils.CustomStyle;/** * @typedef {Object} AnnotationElementParameters * @property {Object} data * @property {HTMLDivElement} layer * @property {PDFPage} page * @property {PageViewport} viewport * @property {IPDFLinkService} linkService *//** * @class * @alias AnnotationElementFactory */function AnnotationElementFactory() {}AnnotationElementFactory.prototype =    /** @lends AnnotationElementFactory.prototype */ {  /**   * @param {AnnotationElementParameters} parameters   * @returns {AnnotationElement}   */  create: function AnnotationElementFactory_create(parameters) {    var subtype = parameters.data.annotationType;    switch (subtype) {      case AnnotationType.LINK:        return new LinkAnnotationElement(parameters);      case AnnotationType.TEXT:        return new TextAnnotationElement(parameters);      case AnnotationType.WIDGET:        return new WidgetAnnotationElement(parameters);      case AnnotationType.POPUP:        return new PopupAnnotationElement(parameters);      case AnnotationType.HIGHLIGHT:        return new HighlightAnnotationElement(parameters);      case AnnotationType.UNDERLINE:        return new UnderlineAnnotationElement(parameters);      case AnnotationType.SQUIGGLY:        return new SquigglyAnnotationElement(parameters);      case AnnotationType.STRIKEOUT:        return new StrikeOutAnnotationElement(parameters);      default:        throw new Error('Unimplemented annotation type "' + subtype + '"');    }  }};/** * @class * @alias AnnotationElement */var AnnotationElement = (function AnnotationElementClosure() {  function AnnotationElement(parameters) {    this.data = parameters.data;    this.layer = parameters.layer;    this.page = parameters.page;    this.viewport = parameters.viewport;    this.linkService = parameters.linkService;    this.container = this._createContainer();  }  AnnotationElement.prototype = /** @lends AnnotationElement.prototype */ {    /**     * Create an empty container for the annotation's HTML element.     *     * @private     * @memberof AnnotationElement     * @returns {HTMLSectionElement}     */    _createContainer: function AnnotationElement_createContainer() {      var data = this.data, page = this.page, viewport = this.viewport;      var container = document.createElement('section');      var width = data.rect[2] - data.rect[0];      var height = data.rect[3] - data.rect[1];      container.setAttribute('data-annotation-id', data.id);      // Do *not* modify `data.rect`, since that will corrupt the annotation      // position on subsequent calls to `_createContainer` (see issue 6804).      var rect = Util.normalizeRect([        data.rect[0],        page.view[3] - data.rect[1] + page.view[1],        data.rect[2],        page.view[3] - data.rect[3] + page.view[1]      ]);      CustomStyle.setProp('transform', container,                          'matrix(' + viewport.transform.join(',') + ')');      CustomStyle.setProp('transformOrigin', container,                          -rect[0] + 'px ' + -rect[1] + 'px');      if (data.borderStyle.width > 0) {        container.style.borderWidth = data.borderStyle.width + 'px';        if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) {          // Underline styles only have a bottom border, so we do not need          // to adjust for all borders. This yields a similar result as          // Adobe Acrobat/Reader.          width = width - 2 * data.borderStyle.width;          height = height - 2 * data.borderStyle.width;        }        var horizontalRadius = data.borderStyle.horizontalCornerRadius;        var verticalRadius = data.borderStyle.verticalCornerRadius;        if (horizontalRadius > 0 || verticalRadius > 0) {          var radius = horizontalRadius + 'px / ' + verticalRadius + 'px';          CustomStyle.setProp('borderRadius', container, radius);        }        switch (data.borderStyle.style) {          case AnnotationBorderStyleType.SOLID:            container.style.borderStyle = 'solid';            break;          case AnnotationBorderStyleType.DASHED:            container.style.borderStyle = 'dashed';            break;          case AnnotationBorderStyleType.BEVELED:            warn('Unimplemented border style: beveled');            break;          case AnnotationBorderStyleType.INSET:            warn('Unimplemented border style: inset');            break;          case AnnotationBorderStyleType.UNDERLINE:            container.style.borderBottomStyle = 'solid';            break;          default:            break;        }        if (data.color) {          container.style.borderColor =            Util.makeCssRgb(data.color[0] | 0,                            data.color[1] | 0,                            data.color[2] | 0);        } else {          // Transparent (invisible) border, so do not draw it at all.          container.style.borderWidth = 0;        }      }      container.style.left = rect[0] + 'px';      container.style.top = rect[1] + 'px';      container.style.width = width + 'px';      container.style.height = height + 'px';      return container;    },    /**     * Render the annotation's HTML element in the empty container.     *     * @public     * @memberof AnnotationElement     */    render: function AnnotationElement_render() {      throw new Error('Abstract method AnnotationElement.render called');    }  };  return AnnotationElement;})();/** * @class * @alias LinkAnnotationElement */var LinkAnnotationElement = (function LinkAnnotationElementClosure() {  function LinkAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(LinkAnnotationElement, AnnotationElement, {    /**     * Render the link annotation's HTML element in the empty container.     *     * @public     * @memberof LinkAnnotationElement     * @returns {HTMLSectionElement}     */    render: function LinkAnnotationElement_render() {      this.container.className = 'linkAnnotation';      var link = document.createElement('a');      addLinkAttributes(link, { url: this.data.url });      if (!this.data.url) {        if (this.data.action) {          this._bindNamedAction(link, this.data.action);        } else {          this._bindLink(link, ('dest' in this.data) ? this.data.dest : null);        }      }      this.container.appendChild(link);      return this.container;    },    /**     * Bind internal links to the link element.     *     * @private     * @param {Object} link     * @param {Object} destination     * @memberof LinkAnnotationElement     */    _bindLink: function LinkAnnotationElement_bindLink(link, destination) {      var self = this;      link.href = this.linkService.getDestinationHash(destination);      link.onclick = function() {        if (destination) {          self.linkService.navigateTo(destination);        }        return false;      };      if (destination) {        link.className = 'internalLink';      }    },    /**     * Bind named actions to the link element.     *     * @private     * @param {Object} link     * @param {Object} action     * @memberof LinkAnnotationElement     */    _bindNamedAction:        function LinkAnnotationElement_bindNamedAction(link, action) {      var self = this;      link.href = this.linkService.getAnchorUrl('');      link.onclick = function() {        self.linkService.executeNamedAction(action);        return false;      };      link.className = 'internalLink';    }  });  return LinkAnnotationElement;})();/** * @class * @alias TextAnnotationElement */var TextAnnotationElement = (function TextAnnotationElementClosure() {  function TextAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(TextAnnotationElement, AnnotationElement, {    /**     * Render the text annotation's HTML element in the empty container.     *     * @public     * @memberof TextAnnotationElement     * @returns {HTMLSectionElement}     */    render: function TextAnnotationElement_render() {      this.container.className = 'textAnnotation';      var image = document.createElement('img');      image.style.height = this.container.style.height;      image.style.width = this.container.style.width;      image.src = PDFJS.imageResourcesPath + 'annotation-' +        this.data.name.toLowerCase() + '.svg';      image.alt = '[{{type}} Annotation]';      image.dataset.l10nId = 'text_annotation_type';      image.dataset.l10nArgs = JSON.stringify({type: this.data.name});      if (!this.data.hasPopup) {        var popupElement = new PopupElement({          container: this.container,          trigger: image,          color: this.data.color,          title: this.data.title,          contents: this.data.contents,          hideWrapper: true        });        var popup = popupElement.render();        // Position the popup next to the Text annotation's container.        popup.style.left = image.style.width;        this.container.appendChild(popup);      }      this.container.appendChild(image);      return this.container;    }  });  return TextAnnotationElement;})();/** * @class * @alias WidgetAnnotationElement */var WidgetAnnotationElement = (function WidgetAnnotationElementClosure() {  function WidgetAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(WidgetAnnotationElement, AnnotationElement, {    /**     * Render the widget annotation's HTML element in the empty container.     *     * @public     * @memberof WidgetAnnotationElement     * @returns {HTMLSectionElement}     */    render: function WidgetAnnotationElement_render() {      var content = document.createElement('div');      content.textContent = this.data.fieldValue;      var textAlignment = this.data.textAlignment;      content.style.textAlign = ['left', 'center', 'right'][textAlignment];      content.style.verticalAlign = 'middle';      content.style.display = 'table-cell';      var font = (this.data.fontRefName ?        this.page.commonObjs.getData(this.data.fontRefName) : null);      this._setTextStyle(content, font);      this.container.appendChild(content);      return this.container;    },    /**     * Apply text styles to the text in the element.     *     * @private     * @param {HTMLDivElement} element     * @param {Object} font     * @memberof WidgetAnnotationElement     */    _setTextStyle:        function WidgetAnnotationElement_setTextStyle(element, font) {      // TODO: This duplicates some of the logic in CanvasGraphics.setFont().      var style = element.style;      style.fontSize = this.data.fontSize + 'px';      style.direction = (this.data.fontDirection < 0 ? 'rtl': 'ltr');      if (!font) {        return;      }      style.fontWeight = (font.black ?        (font.bold ? '900' : 'bold') :        (font.bold ? 'bold' : 'normal'));      style.fontStyle = (font.italic ? 'italic' : 'normal');      // Use a reasonable default font if the font doesn't specify a fallback.      var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : '';      var fallbackName = font.fallbackName || 'Helvetica, sans-serif';      style.fontFamily = fontFamily + fallbackName;    }  });  return WidgetAnnotationElement;})();/** * @class * @alias PopupAnnotationElement */var PopupAnnotationElement = (function PopupAnnotationElementClosure() {  function PopupAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(PopupAnnotationElement, AnnotationElement, {    /**     * Render the popup annotation's HTML element in the empty container.     *     * @public     * @memberof PopupAnnotationElement     * @returns {HTMLSectionElement}     */    render: function PopupAnnotationElement_render() {      this.container.className = 'popupAnnotation';      var selector = '[data-annotation-id="' + this.data.parentId + '"]';      var parentElement = this.layer.querySelector(selector);      if (!parentElement) {        return this.container;      }      var popup = new PopupElement({        container: this.container,        trigger: parentElement,        color: this.data.color,        title: this.data.title,        contents: this.data.contents      });      // Position the popup next to the parent annotation's container.      // PDF viewers ignore a popup annotation's rectangle.      var parentLeft = parseFloat(parentElement.style.left);      var parentWidth = parseFloat(parentElement.style.width);      CustomStyle.setProp('transformOrigin', this.container,                          -(parentLeft + parentWidth) + 'px -' +                          parentElement.style.top);      this.container.style.left = (parentLeft + parentWidth) + 'px';      this.container.appendChild(popup.render());      return this.container;    }  });  return PopupAnnotationElement;})();/** * @class * @alias PopupElement */var PopupElement = (function PopupElementClosure() {  var BACKGROUND_ENLIGHT = 0.7;  function PopupElement(parameters) {    this.container = parameters.container;    this.trigger = parameters.trigger;    this.color = parameters.color;    this.title = parameters.title;    this.contents = parameters.contents;    this.hideWrapper = parameters.hideWrapper || false;    this.pinned = false;  }  PopupElement.prototype = /** @lends PopupElement.prototype */ {    /**     * Render the popup's HTML element.     *     * @public     * @memberof PopupElement     * @returns {HTMLSectionElement}     */    render: function PopupElement_render() {      var wrapper = document.createElement('div');      wrapper.className = 'popupWrapper';      // For Popup annotations we hide the entire section because it contains      // only the popup. However, for Text annotations without a separate Popup      // annotation, we cannot hide the entire container as the image would      // disappear too. In that special case, hiding the wrapper suffices.      this.hideElement = (this.hideWrapper ? wrapper : this.container);      this.hideElement.setAttribute('hidden', true);      var popup = document.createElement('div');      popup.className = 'popup';      var color = this.color;      if (color) {        // Enlighten the color.        var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];        var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];        var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];        popup.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0);      }      var contents = this._formatContents(this.contents);      var title = document.createElement('h1');      title.textContent = this.title;      // Attach the event listeners to the trigger element.      this.trigger.addEventListener('click', this._toggle.bind(this));      this.trigger.addEventListener('mouseover', this._show.bind(this, false));      this.trigger.addEventListener('mouseout', this._hide.bind(this, false));      popup.addEventListener('click', this._hide.bind(this, true));      popup.appendChild(title);      popup.appendChild(contents);      wrapper.appendChild(popup);      return wrapper;    },    /**     * Format the contents of the popup by adding newlines where necessary.     *     * @private     * @param {string} contents     * @memberof PopupElement     * @returns {HTMLParagraphElement}     */    _formatContents: function PopupElement_formatContents(contents) {      var p = document.createElement('p');      var lines = contents.split(/(?:\r\n?|\n)/);      for (var i = 0, ii = lines.length; i < ii; ++i) {        var line = lines[i];        p.appendChild(document.createTextNode(line));        if (i < (ii - 1)) {          p.appendChild(document.createElement('br'));        }      }      return p;    },    /**     * Toggle the visibility of the popup.     *     * @private     * @memberof PopupElement     */    _toggle: function PopupElement_toggle() {      if (this.pinned) {        this._hide(true);      } else {        this._show(true);      }    },    /**     * Show the popup.     *     * @private     * @param {boolean} pin     * @memberof PopupElement     */    _show: function PopupElement_show(pin) {      if (pin) {        this.pinned = true;      }      if (this.hideElement.hasAttribute('hidden')) {        this.hideElement.removeAttribute('hidden');        this.container.style.zIndex += 1;      }    },    /**     * Hide the popup.     *     * @private     * @param {boolean} unpin     * @memberof PopupElement     */    _hide: function PopupElement_hide(unpin) {      if (unpin) {        this.pinned = false;      }      if (!this.hideElement.hasAttribute('hidden') && !this.pinned) {        this.hideElement.setAttribute('hidden', true);        this.container.style.zIndex -= 1;      }    }  };  return PopupElement;})();/** * @class * @alias HighlightAnnotationElement */var HighlightAnnotationElement = (    function HighlightAnnotationElementClosure() {  function HighlightAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(HighlightAnnotationElement, AnnotationElement, {    /**     * Render the highlight annotation's HTML element in the empty container.     *     * @public     * @memberof HighlightAnnotationElement     * @returns {HTMLSectionElement}     */    render: function HighlightAnnotationElement_render() {      this.container.className = 'highlightAnnotation';      return this.container;    }  });  return HighlightAnnotationElement;})();/** * @class * @alias UnderlineAnnotationElement */var UnderlineAnnotationElement = (    function UnderlineAnnotationElementClosure() {  function UnderlineAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(UnderlineAnnotationElement, AnnotationElement, {    /**     * Render the underline annotation's HTML element in the empty container.     *     * @public     * @memberof UnderlineAnnotationElement     * @returns {HTMLSectionElement}     */    render: function UnderlineAnnotationElement_render() {      this.container.className = 'underlineAnnotation';      return this.container;    }  });  return UnderlineAnnotationElement;})();/** * @class * @alias SquigglyAnnotationElement */var SquigglyAnnotationElement = (function SquigglyAnnotationElementClosure() {  function SquigglyAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(SquigglyAnnotationElement, AnnotationElement, {    /**     * Render the squiggly annotation's HTML element in the empty container.     *     * @public     * @memberof SquigglyAnnotationElement     * @returns {HTMLSectionElement}     */    render: function SquigglyAnnotationElement_render() {      this.container.className = 'squigglyAnnotation';      return this.container;    }  });  return SquigglyAnnotationElement;})();/** * @class * @alias StrikeOutAnnotationElement */var StrikeOutAnnotationElement = (    function StrikeOutAnnotationElementClosure() {  function StrikeOutAnnotationElement(parameters) {    AnnotationElement.call(this, parameters);  }  Util.inherit(StrikeOutAnnotationElement, AnnotationElement, {    /**     * Render the strikeout annotation's HTML element in the empty container.     *     * @public     * @memberof StrikeOutAnnotationElement     * @returns {HTMLSectionElement}     */    render: function StrikeOutAnnotationElement_render() {      this.container.className = 'strikeoutAnnotation';      return this.container;    }  });  return StrikeOutAnnotationElement;})();/** * @typedef {Object} AnnotationLayerParameters * @property {PageViewport} viewport * @property {HTMLDivElement} div * @property {Array} annotations * @property {PDFPage} page * @property {IPDFLinkService} linkService *//** * @class * @alias AnnotationLayer */var AnnotationLayer = (function AnnotationLayerClosure() {  return {    /**     * Render a new annotation layer with all annotation elements.     *     * @public     * @param {AnnotationLayerParameters} parameters     * @memberof AnnotationLayer     */    render: function AnnotationLayer_render(parameters) {      var annotationElementFactory = new AnnotationElementFactory();      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {        var data = parameters.annotations[i];        if (!data || !data.hasHtml) {          continue;        }        var properties = {          data: data,          layer: parameters.div,          page: parameters.page,          viewport: parameters.viewport,          linkService: parameters.linkService        };        var element = annotationElementFactory.create(properties);        parameters.div.appendChild(element.render());      }    },    /**     * Update the annotation elements on existing annotation layer.     *     * @public     * @param {AnnotationLayerParameters} parameters     * @memberof AnnotationLayer     */    update: function AnnotationLayer_update(parameters) {      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {        var data = parameters.annotations[i];        var element = parameters.div.querySelector(          '[data-annotation-id="' + data.id + '"]');        if (element) {          CustomStyle.setProp('transform', element,            'matrix(' + parameters.viewport.transform.join(',') + ')');        }      }      parameters.div.removeAttribute('hidden');    }  };})();PDFJS.AnnotationLayer = AnnotationLayer;exports.AnnotationLayer = AnnotationLayer;}));(function (root, factory) {  {    factory((root.pdfjsDisplayFontLoader = {}), root.pdfjsSharedUtil,      root.pdfjsSharedGlobal);  }}(this, function (exports, sharedUtil, sharedGlobal) {var assert = sharedUtil.assert;var bytesToString = sharedUtil.bytesToString;var string32 = sharedUtil.string32;var shadow = sharedUtil.shadow;var warn = sharedUtil.warn;var PDFJS = sharedGlobal.PDFJS;var globalScope = sharedGlobal.globalScope;var isWorker = sharedGlobal.isWorker;function FontLoader(docId) {  this.docId = docId;  this.styleElement = null;  this.nativeFontFaces = [];  this.loadTestFontId = 0;  this.loadingContext = {    requests: [],    nextRequestId: 0  };}FontLoader.prototype = {  insertRule: function fontLoaderInsertRule(rule) {    var styleElement = this.styleElement;    if (!styleElement) {      styleElement = this.styleElement = document.createElement('style');      styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId;      document.documentElement.getElementsByTagName('head')[0].appendChild(        styleElement);    }    var styleSheet = styleElement.sheet;    styleSheet.insertRule(rule, styleSheet.cssRules.length);  },  clear: function fontLoaderClear() {    var styleElement = this.styleElement;    if (styleElement) {      styleElement.parentNode.removeChild(styleElement);      styleElement = this.styleElement = null;    }    this.nativeFontFaces.forEach(function(nativeFontFace) {      document.fonts.delete(nativeFontFace);    });    this.nativeFontFaces.length = 0;  },  get loadTestFont() {    // This is a CFF font with 1 glyph for '.' that fills its entire width and    // height.    return shadow(this, 'loadTestFont', atob(      'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' +      'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' +      'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' +      'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' +      'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' +      'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' +      'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' +      'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' +      'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' +      'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' +      'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' +      'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' +      'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' +      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' +      'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' +      'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' +      'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' +      'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' +      'ABAAAAAAAAAAAD6AAAAAAAAA=='    ));  },  addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) {    this.nativeFontFaces.push(nativeFontFace);    document.fonts.add(nativeFontFace);  },  bind: function fontLoaderBind(fonts, callback) {    assert(!isWorker, 'bind() shall be called from main thread');    var rules = [];    var fontsToLoad = [];    var fontLoadPromises = [];    var getNativeFontPromise = function(nativeFontFace) {      // Return a promise that is always fulfilled, even when the font fails to      // load.      return nativeFontFace.loaded.catch(function(e) {        warn('Failed to load font "' + nativeFontFace.family + '": ' + e);      });    };    for (var i = 0, ii = fonts.length; i < ii; i++) {      var font = fonts[i];      // Add the font to the DOM only once or skip if the font      // is already loaded.      if (font.attached || font.loading === false) {        continue;      }      font.attached = true;      if (FontLoader.isFontLoadingAPISupported) {        var nativeFontFace = font.createNativeFontFace();        if (nativeFontFace) {          this.addNativeFontFace(nativeFontFace);          fontLoadPromises.push(getNativeFontPromise(nativeFontFace));        }      } else {        var rule = font.createFontFaceRule();        if (rule) {          this.insertRule(rule);          rules.push(rule);          fontsToLoad.push(font);        }      }    }    var request = this.queueLoadingCallback(callback);    if (FontLoader.isFontLoadingAPISupported) {      Promise.all(fontLoadPromises).then(function() {        request.complete();      });    } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) {      this.prepareFontLoadEvent(rules, fontsToLoad, request);    } else {      request.complete();    }  },  queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) {    function LoadLoader_completeRequest() {      assert(!request.end, 'completeRequest() cannot be called twice');      request.end = Date.now();      // sending all completed requests in order how they were queued      while (context.requests.length > 0 && context.requests[0].end) {        var otherRequest = context.requests.shift();        setTimeout(otherRequest.callback, 0);      }    }    var context = this.loadingContext;    var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++);    var request = {      id: requestId,      complete: LoadLoader_completeRequest,      callback: callback,      started: Date.now()    };    context.requests.push(request);    return request;  },  prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules,                                                                fonts,                                                                request) {      /** Hack begin */      // There's currently no event when a font has finished downloading so the      // following code is a dirty hack to 'guess' when a font is      // ready. It's assumed fonts are loaded in order, so add a known test      // font after the desired fonts and then test for the loading of that      // test font.      function int32(data, offset) {        return (data.charCodeAt(offset) << 24) |               (data.charCodeAt(offset + 1) << 16) |               (data.charCodeAt(offset + 2) << 8) |               (data.charCodeAt(offset + 3) & 0xff);      }      function spliceString(s, offset, remove, insert) {        var chunk1 = s.substr(0, offset);        var chunk2 = s.substr(offset + remove);        return chunk1 + insert + chunk2;      }      var i, ii;      var canvas = document.createElement('canvas');      canvas.width = 1;      canvas.height = 1;      var ctx = canvas.getContext('2d');      var called = 0;      function isFontReady(name, callback) {        called++;        // With setTimeout clamping this gives the font ~100ms to load.        if(called > 30) {          warn('Load test font never loaded.');          callback();          return;        }        ctx.font = '30px ' + name;        ctx.fillText('.', 0, 20);        var imageData = ctx.getImageData(0, 0, 1, 1);        if (imageData.data[3] > 0) {          callback();          return;        }        setTimeout(isFontReady.bind(null, name, callback));      }      var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;      // Chromium seems to cache fonts based on a hash of the actual font data,      // so the font must be modified for each load test else it will appear to      // be loaded already.      // TODO: This could maybe be made faster by avoiding the btoa of the full      // font by splitting it in chunks before hand and padding the font id.      var data = this.loadTestFont;      var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)      data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length,                          loadTestFontId);      // CFF checksum is important for IE, adjusting it      var CFF_CHECKSUM_OFFSET = 16;      var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X'      var checksum = int32(data, CFF_CHECKSUM_OFFSET);      for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {        checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;      }      if (i < loadTestFontId.length) { // align to 4 bytes boundary        checksum = (checksum - XXXX_VALUE +                    int32(loadTestFontId + 'XXX', i)) | 0;      }      data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));      var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';      var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' +                 url + '}';      this.insertRule(rule);      var names = [];      for (i = 0, ii = fonts.length; i < ii; i++) {        names.push(fonts[i].loadedName);      }      names.push(loadTestFontId);      var div = document.createElement('div');      div.setAttribute('style',                       'visibility: hidden;' +                       'width: 10px; height: 10px;' +                       'position: absolute; top: 0px; left: 0px;');      for (i = 0, ii = names.length; i < ii; ++i) {        var span = document.createElement('span');        span.textContent = 'Hi';        span.style.fontFamily = names[i];        div.appendChild(span);      }      document.body.appendChild(div);      isFontReady(loadTestFontId, function() {        document.body.removeChild(div);        request.complete();      });      /** Hack end */  }};FontLoader.isFontLoadingAPISupported = (!isWorker &&  typeof document !== 'undefined' && !!document.fonts);Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', {  get: function () {    var supported = false;    // User agent string sniffing is bad, but there is no reliable way to tell    // if font is fully loaded and ready to be used with canvas.    var userAgent = window.navigator.userAgent;    var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);    if (m && m[1] >= 14) {      supported = true;    }    // TODO other browsers    if (userAgent === 'node') {      supported = true;    }    return shadow(FontLoader, 'isSyncFontLoadingSupported', supported);  },  enumerable: true,  configurable: true});var FontFaceObject = (function FontFaceObjectClosure() {  function FontFaceObject(translatedData) {    this.compiledGlyphs = {};    // importing translated data    for (var i in translatedData) {      this[i] = translatedData[i];    }  }  Object.defineProperty(FontFaceObject, 'isEvalSupported', {    get: function () {      var evalSupport = false;      if (PDFJS.isEvalSupported) {        try {          /* jshint evil: true */          new Function('');          evalSupport = true;        } catch (e) {}      }      return shadow(this, 'isEvalSupported', evalSupport);    },    enumerable: true,    configurable: true  });  FontFaceObject.prototype = {    createNativeFontFace: function FontFaceObject_createNativeFontFace() {      if (!this.data) {        return null;      }      if (PDFJS.disableFontFace) {        this.disableFontFace = true;        return null;      }      var nativeFontFace = new FontFace(this.loadedName, this.data, {});      if (PDFJS.pdfBug && 'FontInspector' in globalScope &&          globalScope['FontInspector'].enabled) {        globalScope['FontInspector'].fontAdded(this);      }      return nativeFontFace;    },    createFontFaceRule: function FontFaceObject_createFontFaceRule() {      if (!this.data) {        return null;      }      if (PDFJS.disableFontFace) {        this.disableFontFace = true;        return null;      }      var data = bytesToString(new Uint8Array(this.data));      var fontName = this.loadedName;      // Add the font-face rule to the document      var url = ('url(data:' + this.mimetype + ';base64,' +                 window.btoa(data) + ');');      var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}';      if (PDFJS.pdfBug && 'FontInspector' in globalScope &&          globalScope['FontInspector'].enabled) {        globalScope['FontInspector'].fontAdded(this, url);      }      return rule;    },    getPathGenerator:        function FontFaceObject_getPathGenerator(objs, character) {      if (!(character in this.compiledGlyphs)) {        var cmds = objs.get(this.loadedName + '_path_' + character);        var current, i, len;        // If we can, compile cmds into JS for MAXIMUM SPEED        if (FontFaceObject.isEvalSupported) {          var args, js = '';          for (i = 0, len = cmds.length; i < len; i++) {            current = cmds[i];            if (current.args !== undefined) {              args = current.args.join(',');            } else {              args = '';            }            js += 'c.' + current.cmd + '(' + args + ');\n';          }          /* jshint -W054 */          this.compiledGlyphs[character] = new Function('c', 'size', js);        } else {          // But fall back on using Function.prototype.apply() if we're          // blocked from using eval() for whatever reason (like CSP policies)          this.compiledGlyphs[character] = function(c, size) {            for (i = 0, len = cmds.length; i < len; i++) {              current = cmds[i];              if (current.cmd === 'scale') {                current.args = [size, -size];              }              c[current.cmd].apply(c, current.args);            }          };        }      }      return this.compiledGlyphs[character];    }  };  return FontFaceObject;})();exports.FontFaceObject = FontFaceObject;exports.FontLoader = FontLoader;}));(function (root, factory) {  {    factory((root.pdfjsDisplayMetadata = {}), root.pdfjsSharedUtil);  }}(this, function (exports, sharedUtil) {var error = sharedUtil.error;var Metadata = PDFJS.Metadata = (function MetadataClosure() {  function fixMetadata(meta) {    return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {      var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,                                function(code, d1, d2, d3) {        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);      });      var chars = '';      for (var i = 0; i < bytes.length; i += 2) {        var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);        chars += code >= 32 && code < 127 && code !== 60 && code !== 62 &&          code !== 38 && false ? String.fromCharCode(code) :          '&#x' + (0x10000 + code).toString(16).substring(1) + ';';      }      return '>' + chars;    });  }  function Metadata(meta) {    if (typeof meta === 'string') {      // Ghostscript produces invalid metadata      meta = fixMetadata(meta);      var parser = new DOMParser();      meta = parser.parseFromString(meta, 'application/xml');    } else if (!(meta instanceof Document)) {      error('Metadata: Invalid metadata object');    }    this.metaDocument = meta;    this.metadata = {};    this.parse();  }  Metadata.prototype = {    parse: function Metadata_parse() {      var doc = this.metaDocument;      var rdf = doc.documentElement;      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>        rdf = rdf.firstChild;        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {          rdf = rdf.nextSibling;        }      }      var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {        return;      }      var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength;      for (i = 0, length = children.length; i < length; i++) {        desc = children[i];        if (desc.nodeName.toLowerCase() !== 'rdf:description') {          continue;        }        for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {          if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {            entry = desc.childNodes[ii];            name = entry.nodeName.toLowerCase();            this.metadata[name] = entry.textContent.trim();          }        }      }    },    get: function Metadata_get(name) {      return this.metadata[name] || null;    },    has: function Metadata_has(name) {      return typeof this.metadata[name] !== 'undefined';    }  };  return Metadata;})();exports.Metadata = Metadata;}));(function (root, factory) {  {    factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil);  }}(this, function (exports, sharedUtil) {var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX;var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX;var ImageKind = sharedUtil.ImageKind;var OPS = sharedUtil.OPS;var Util = sharedUtil.Util;var isNum = sharedUtil.isNum;var isArray = sharedUtil.isArray;var warn = sharedUtil.warn;var SVG_DEFAULTS = {  fontStyle: 'normal',  fontWeight: 'normal',  fillColor: '#000000'};var convertImgDataToPng = (function convertImgDataToPngClosure() {  var PNG_HEADER =    new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);  var CHUNK_WRAPPER_SIZE = 12;  var crcTable = new Int32Array(256);  for (var i = 0; i < 256; i++) {    var c = i;    for (var h = 0; h < 8; h++) {      if (c & 1) {        c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);      } else {        c = (c >> 1) & 0x7fffffff;      }    }    crcTable[i] = c;  }  function crc32(data, start, end) {    var crc = -1;    for (var i = start; i < end; i++) {      var a = (crc ^ data[i]) & 0xff;      var b = crcTable[a];      crc = (crc >>> 8) ^ b;    }    return crc ^ -1;  }  function writePngChunk(type, body, data, offset) {    var p = offset;    var len = body.length;    data[p] = len >> 24 & 0xff;    data[p + 1] = len >> 16 & 0xff;    data[p + 2] = len >> 8 & 0xff;    data[p + 3] = len & 0xff;    p += 4;    data[p] = type.charCodeAt(0) & 0xff;    data[p + 1] = type.charCodeAt(1) & 0xff;    data[p + 2] = type.charCodeAt(2) & 0xff;    data[p + 3] = type.charCodeAt(3) & 0xff;    p += 4;    data.set(body, p);    p += body.length;    var crc = crc32(data, offset + 4, p);    data[p] = crc >> 24 & 0xff;    data[p + 1] = crc >> 16 & 0xff;    data[p + 2] = crc >> 8 & 0xff;    data[p + 3] = crc & 0xff;  }  function adler32(data, start, end) {    var a = 1;    var b = 0;    for (var i = start; i < end; ++i) {      a = (a + (data[i] & 0xff)) % 65521;      b = (b + a) % 65521;    }    return (b << 16) | a;  }  function encode(imgData, kind) {    var width = imgData.width;    var height = imgData.height;    var bitDepth, colorType, lineSize;    var bytes = imgData.data;    switch (kind) {      case ImageKind.GRAYSCALE_1BPP:        colorType = 0;        bitDepth = 1;        lineSize = (width + 7) >> 3;        break;      case ImageKind.RGB_24BPP:        colorType = 2;        bitDepth = 8;        lineSize = width * 3;        break;      case ImageKind.RGBA_32BPP:        colorType = 6;        bitDepth = 8;        lineSize = width * 4;        break;      default:        throw new Error('invalid format');    }    // prefix every row with predictor 0    var literals = new Uint8Array((1 + lineSize) * height);    var offsetLiterals = 0, offsetBytes = 0;    var y, i;    for (y = 0; y < height; ++y) {      literals[offsetLiterals++] = 0; // no prediction      literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),                   offsetLiterals);      offsetBytes += lineSize;      offsetLiterals += lineSize;    }    if (kind === ImageKind.GRAYSCALE_1BPP) {      // inverting for B/W      offsetLiterals = 0;      for (y = 0; y < height; y++) {        offsetLiterals++; // skipping predictor        for (i = 0; i < lineSize; i++) {          literals[offsetLiterals++] ^= 0xFF;        }      }    }    var ihdr = new Uint8Array([      width >> 24 & 0xff,      width >> 16 & 0xff,      width >> 8 & 0xff,      width & 0xff,      height >> 24 & 0xff,      height >> 16 & 0xff,      height >> 8 & 0xff,      height & 0xff,      bitDepth, // bit depth      colorType, // color type      0x00, // compression method      0x00, // filter method      0x00 // interlace method    ]);    var len = literals.length;    var maxBlockLength = 0xFFFF;    var deflateBlocks = Math.ceil(len / maxBlockLength);    var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);    var pi = 0;    idat[pi++] = 0x78; // compression method and flags    idat[pi++] = 0x9c; // flags    var pos = 0;    while (len > maxBlockLength) {      // writing non-final DEFLATE blocks type 0 and length of 65535      idat[pi++] = 0x00;      idat[pi++] = 0xff;      idat[pi++] = 0xff;      idat[pi++] = 0x00;      idat[pi++] = 0x00;      idat.set(literals.subarray(pos, pos + maxBlockLength), pi);      pi += maxBlockLength;      pos += maxBlockLength;      len -= maxBlockLength;    }    // writing non-final DEFLATE blocks type 0    idat[pi++] = 0x01;    idat[pi++] = len & 0xff;    idat[pi++] = len >> 8 & 0xff;    idat[pi++] = (~len & 0xffff) & 0xff;    idat[pi++] = (~len & 0xffff) >> 8 & 0xff;    idat.set(literals.subarray(pos), pi);    pi += literals.length - pos;    var adler = adler32(literals, 0, literals.length); // checksum    idat[pi++] = adler >> 24 & 0xff;    idat[pi++] = adler >> 16 & 0xff;    idat[pi++] = adler >> 8 & 0xff;    idat[pi++] = adler & 0xff;    // PNG will consists: header, IHDR+data, IDAT+data, and IEND.    var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +                    ihdr.length + idat.length;    var data = new Uint8Array(pngLength);    var offset = 0;    data.set(PNG_HEADER, offset);    offset += PNG_HEADER.length;    writePngChunk('IHDR', ihdr, data, offset);    offset += CHUNK_WRAPPER_SIZE + ihdr.length;    writePngChunk('IDATA', idat, data, offset);    offset += CHUNK_WRAPPER_SIZE + idat.length;    writePngChunk('IEND', new Uint8Array(0), data, offset);    return PDFJS.createObjectURL(data, 'image/png');  }  return function convertImgDataToPng(imgData) {    var kind = (imgData.kind === undefined ?                ImageKind.GRAYSCALE_1BPP : imgData.kind);    return encode(imgData, kind);  };})();var SVGExtraState = (function SVGExtraStateClosure() {  function SVGExtraState() {    this.fontSizeScale = 1;    this.fontWeight = SVG_DEFAULTS.fontWeight;    this.fontSize = 0;    this.textMatrix = IDENTITY_MATRIX;    this.fontMatrix = FONT_IDENTITY_MATRIX;    this.leading = 0;    // Current point (in user coordinates)    this.x = 0;    this.y = 0;    // Start of text line (in text coordinates)    this.lineX = 0;    this.lineY = 0;    // Character and word spacing    this.charSpacing = 0;    this.wordSpacing = 0;    this.textHScale = 1;    this.textRise = 0;    // Default foreground and background colors    this.fillColor = SVG_DEFAULTS.fillColor;    this.strokeColor = '#000000';    this.fillAlpha = 1;    this.strokeAlpha = 1;    this.lineWidth = 1;    this.lineJoin = '';    this.lineCap = '';    this.miterLimit = 0;    this.dashArray = [];    this.dashPhase = 0;    this.dependencies = [];    // Clipping    this.clipId = '';    this.pendingClip = false;    this.maskId = '';  }  SVGExtraState.prototype = {    clone: function SVGExtraState_clone() {      return Object.create(this);    },    setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {      this.x = x;      this.y = y;    }  };  return SVGExtraState;})();var SVGGraphics = (function SVGGraphicsClosure() {  function createScratchSVG(width, height) {    var NS = 'http://www.w3.org/2000/svg';    var svg = document.createElementNS(NS, 'svg:svg');    svg.setAttributeNS(null, 'version', '1.1');    svg.setAttributeNS(null, 'width', width + 'px');    svg.setAttributeNS(null, 'height', height + 'px');    svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);    return svg;  }  function opListToTree(opList) {    var opTree = [];    var tmp = [];    var opListLen = opList.length;    for (var x = 0; x < opListLen; x++) {      if (opList[x].fn === 'save') {        opTree.push({'fnId': 92, 'fn': 'group', 'items': []});        tmp.push(opTree);        opTree = opTree[opTree.length - 1].items;        continue;      }      if(opList[x].fn === 'restore') {        opTree = tmp.pop();      } else {        opTree.push(opList[x]);      }    }    return opTree;  }  /**   * Formats float number.   * @param value {number} number to format.   * @returns {string}   */  function pf(value) {    if (value === (value | 0)) { // integer number      return value.toString();    }    var s = value.toFixed(10);    var i = s.length - 1;    if (s[i] !== '0') {      return s;    }    // removing trailing zeros    do {      i--;    } while (s[i] === '0');    return s.substr(0, s[i] === '.' ? i : i + 1);  }  /**   * Formats transform matrix. The standard rotation, scale and translate   * matrices are replaced by their shorter forms, and for identity matrix   * returns empty string to save the memory.   * @param m {Array} matrix to format.   * @returns {string}   */  function pm(m) {    if (m[4] === 0 && m[5] === 0) {      if (m[1] === 0 && m[2] === 0) {        if (m[0] === 1 && m[3] === 1) {          return '';        }        return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';      }      if (m[0] === m[3] && m[1] === -m[2]) {        var a = Math.acos(m[0]) * 180 / Math.PI;        return 'rotate(' + pf(a) + ')';      }    } else {      if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {        return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';      }    }    return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +      pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';  }  function SVGGraphics(commonObjs, objs) {    this.current = new SVGExtraState();    this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix    this.transformStack = [];    this.extraStack = [];    this.commonObjs = commonObjs;    this.objs = objs;    this.pendingEOFill = false;    this.embedFonts = false;    this.embeddedFonts = {};    this.cssStyle = null;  }  var NS = 'http://www.w3.org/2000/svg';  var XML_NS = 'http://www.w3.org/XML/1998/namespace';  var XLINK_NS = 'http://www.w3.org/1999/xlink';  var LINE_CAP_STYLES = ['butt', 'round', 'square'];  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];  var clipCount = 0;  var maskCount = 0;  SVGGraphics.prototype = {    save: function SVGGraphics_save() {      this.transformStack.push(this.transformMatrix);      var old = this.current;      this.extraStack.push(old);      this.current = old.clone();    },    restore: function SVGGraphics_restore() {      this.transformMatrix = this.transformStack.pop();      this.current = this.extraStack.pop();      this.tgrp = document.createElementNS(NS, 'svg:g');      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));      this.pgrp.appendChild(this.tgrp);    },    group: function SVGGraphics_group(items) {      this.save();      this.executeOpTree(items);      this.restore();    },    loadDependencies: function SVGGraphics_loadDependencies(operatorList) {      var fnArray = operatorList.fnArray;      var fnArrayLen = fnArray.length;      var argsArray = operatorList.argsArray;      var self = this;      for (var i = 0; i < fnArrayLen; i++) {        if (OPS.dependency === fnArray[i]) {          var deps = argsArray[i];          for (var n = 0, nn = deps.length; n < nn; n++) {            var obj = deps[n];            var common = obj.substring(0, 2) === 'g_';            var promise;            if (common) {              promise = new Promise(function(resolve) {                self.commonObjs.get(obj, resolve);              });            } else {              promise = new Promise(function(resolve) {                self.objs.get(obj, resolve);              });            }            this.current.dependencies.push(promise);          }        }      }      return Promise.all(this.current.dependencies);    },    transform: function SVGGraphics_transform(a, b, c, d, e, f) {      var transformMatrix = [a, b, c, d, e, f];      this.transformMatrix = PDFJS.Util.transform(this.transformMatrix,                                                  transformMatrix);      this.tgrp = document.createElementNS(NS, 'svg:g');      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));    },    getSVG: function SVGGraphics_getSVG(operatorList, viewport) {      this.svg = createScratchSVG(viewport.width, viewport.height);      this.viewport = viewport;      return this.loadDependencies(operatorList).then(function () {        this.transformMatrix = IDENTITY_MATRIX;        this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group        this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));        this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group        this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));        this.defs = document.createElementNS(NS, 'svg:defs');        this.pgrp.appendChild(this.defs);        this.pgrp.appendChild(this.tgrp);        this.svg.appendChild(this.pgrp);        var opTree = this.convertOpList(operatorList);        this.executeOpTree(opTree);        return this.svg;      }.bind(this));    },    convertOpList: function SVGGraphics_convertOpList(operatorList) {      var argsArray = operatorList.argsArray;      var fnArray = operatorList.fnArray;      var fnArrayLen  = fnArray.length;      var REVOPS = [];      var opList = [];      for (var op in OPS) {        REVOPS[OPS[op]] = op;      }      for (var x = 0; x < fnArrayLen; x++) {        var fnId = fnArray[x];        opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]});      }      return opListToTree(opList);    },    executeOpTree: function SVGGraphics_executeOpTree(opTree) {      var opTreeLen = opTree.length;      for(var x = 0; x < opTreeLen; x++) {        var fn = opTree[x].fn;        var fnId = opTree[x].fnId;        var args = opTree[x].args;        switch (fnId | 0) {          case OPS.beginText:            this.beginText();            break;          case OPS.setLeading:            this.setLeading(args);            break;          case OPS.setLeadingMoveText:            this.setLeadingMoveText(args[0], args[1]);            break;          case OPS.setFont:            this.setFont(args);            break;          case OPS.showText:            this.showText(args[0]);            break;          case OPS.showSpacedText:            this.showText(args[0]);            break;          case OPS.endText:            this.endText();            break;          case OPS.moveText:            this.moveText(args[0], args[1]);            break;          case OPS.setCharSpacing:            this.setCharSpacing(args[0]);            break;          case OPS.setWordSpacing:            this.setWordSpacing(args[0]);            break;          case OPS.setHScale:            this.setHScale(args[0]);            break;          case OPS.setTextMatrix:            this.setTextMatrix(args[0], args[1], args[2],                               args[3], args[4], args[5]);            break;          case OPS.setLineWidth:            this.setLineWidth(args[0]);            break;          case OPS.setLineJoin:            this.setLineJoin(args[0]);            break;          case OPS.setLineCap:            this.setLineCap(args[0]);            break;          case OPS.setMiterLimit:            this.setMiterLimit(args[0]);            break;          case OPS.setFillRGBColor:            this.setFillRGBColor(args[0], args[1], args[2]);            break;          case OPS.setStrokeRGBColor:            this.setStrokeRGBColor(args[0], args[1], args[2]);            break;          case OPS.setDash:            this.setDash(args[0], args[1]);            break;          case OPS.setGState:            this.setGState(args[0]);            break;          case OPS.fill:            this.fill();            break;          case OPS.eoFill:            this.eoFill();            break;          case OPS.stroke:            this.stroke();            break;          case OPS.fillStroke:            this.fillStroke();            break;          case OPS.eoFillStroke:            this.eoFillStroke();            break;          case OPS.clip:            this.clip('nonzero');            break;          case OPS.eoClip:            this.clip('evenodd');            break;          case OPS.paintSolidColorImageMask:            this.paintSolidColorImageMask();            break;          case OPS.paintJpegXObject:            this.paintJpegXObject(args[0], args[1], args[2]);            break;          case OPS.paintImageXObject:            this.paintImageXObject(args[0]);            break;          case OPS.paintInlineImageXObject:            this.paintInlineImageXObject(args[0]);            break;          case OPS.paintImageMaskXObject:            this.paintImageMaskXObject(args[0]);            break;          case OPS.paintFormXObjectBegin:            this.paintFormXObjectBegin(args[0], args[1]);            break;          case OPS.paintFormXObjectEnd:            this.paintFormXObjectEnd();            break;          case OPS.closePath:            this.closePath();            break;          case OPS.closeStroke:            this.closeStroke();            break;          case OPS.closeFillStroke:            this.closeFillStroke();            break;          case OPS.nextLine:            this.nextLine();            break;          case OPS.transform:            this.transform(args[0], args[1], args[2], args[3],                           args[4], args[5]);            break;          case OPS.constructPath:            this.constructPath(args[0], args[1]);            break;          case OPS.endPath:            this.endPath();            break;          case 92:            this.group(opTree[x].items);            break;          default:            warn('Unimplemented method '+ fn);            break;        }      }    },    setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {      this.current.wordSpacing = wordSpacing;    },    setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {      this.current.charSpacing = charSpacing;    },    nextLine: function SVGGraphics_nextLine() {      this.moveText(0, this.current.leading);    },    setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {      var current = this.current;      this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];      this.current.x = this.current.lineX = 0;      this.current.y = this.current.lineY = 0;      current.xcoords = [];      current.tspan = document.createElementNS(NS, 'svg:tspan');      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);      current.tspan.setAttributeNS(null, 'font-size',                                   pf(current.fontSize) + 'px');      current.tspan.setAttributeNS(null, 'y', pf(-current.y));      current.txtElement = document.createElementNS(NS, 'svg:text');      current.txtElement.appendChild(current.tspan);    },    beginText: function SVGGraphics_beginText() {      this.current.x = this.current.lineX = 0;      this.current.y = this.current.lineY = 0;      this.current.textMatrix = IDENTITY_MATRIX;      this.current.lineMatrix = IDENTITY_MATRIX;      this.current.tspan = document.createElementNS(NS, 'svg:tspan');      this.current.txtElement = document.createElementNS(NS, 'svg:text');      this.current.txtgrp = document.createElementNS(NS, 'svg:g');      this.current.xcoords = [];    },    moveText: function SVGGraphics_moveText(x, y) {      var current = this.current;      this.current.x = this.current.lineX += x;      this.current.y = this.current.lineY += y;      current.xcoords = [];      current.tspan = document.createElementNS(NS, 'svg:tspan');      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);      current.tspan.setAttributeNS(null, 'font-size',                                   pf(current.fontSize) + 'px');      current.tspan.setAttributeNS(null, 'y', pf(-current.y));    },    showText: function SVGGraphics_showText(glyphs) {      var current = this.current;      var font = current.font;      var fontSize = current.fontSize;      if (fontSize === 0) {        return;      }      var charSpacing = current.charSpacing;      var wordSpacing = current.wordSpacing;      var fontDirection = current.fontDirection;      var textHScale = current.textHScale * fontDirection;      var glyphsLength = glyphs.length;      var vertical = font.vertical;      var widthAdvanceScale = fontSize * current.fontMatrix[0];      var x = 0, i;      for (i = 0; i < glyphsLength; ++i) {        var glyph = glyphs[i];        if (glyph === null) {          // word break          x += fontDirection * wordSpacing;          continue;        } else if (isNum(glyph)) {          x += -glyph * fontSize * 0.001;          continue;        }        current.xcoords.push(current.x + x * textHScale);        var width = glyph.width;        var character = glyph.fontChar;        var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;        x += charWidth;        current.tspan.textContent += character;      }      if (vertical) {        current.y -= x * textHScale;      } else {        current.x += x * textHScale;      }      current.tspan.setAttributeNS(null, 'x',                                   current.xcoords.map(pf).join(' '));      current.tspan.setAttributeNS(null, 'y', pf(-current.y));      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);      current.tspan.setAttributeNS(null, 'font-size',                                   pf(current.fontSize) + 'px');      if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {        current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);      }      if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {        current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);      }      if (current.fillColor !== SVG_DEFAULTS.fillColor) {        current.tspan.setAttributeNS(null, 'fill', current.fillColor);      }      current.txtElement.setAttributeNS(null, 'transform',                                        pm(current.textMatrix) +                                        ' scale(1, -1)' );      current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');      current.txtElement.appendChild(current.tspan);      current.txtgrp.appendChild(current.txtElement);      this.tgrp.appendChild(current.txtElement);    },    setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {      this.setLeading(-y);      this.moveText(x, y);    },    addFontStyle: function SVGGraphics_addFontStyle(fontObj) {      if (!this.cssStyle) {        this.cssStyle = document.createElementNS(NS, 'svg:style');        this.cssStyle.setAttributeNS(null, 'type', 'text/css');        this.defs.appendChild(this.cssStyle);      }      var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);      this.cssStyle.textContent +=        '@font-face { font-family: "' + fontObj.loadedName + '";' +        ' src: url(' + url + '); }\n';    },    setFont: function SVGGraphics_setFont(details) {      var current = this.current;      var fontObj = this.commonObjs.get(details[0]);      var size = details[1];      this.current.font = fontObj;      if (this.embedFonts && fontObj.data &&          !this.embeddedFonts[fontObj.loadedName]) {        this.addFontStyle(fontObj);        this.embeddedFonts[fontObj.loadedName] = fontObj;      }      current.fontMatrix = (fontObj.fontMatrix ?                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :                                 (fontObj.bold ? 'bold' : 'normal');      var italic = fontObj.italic ? 'italic' : 'normal';      if (size < 0) {        size = -size;        current.fontDirection = -1;      } else {        current.fontDirection = 1;      }      current.fontSize = size;      current.fontFamily = fontObj.loadedName;      current.fontWeight = bold;      current.fontStyle = italic;      current.tspan = document.createElementNS(NS, 'svg:tspan');      current.tspan.setAttributeNS(null, 'y', pf(-current.y));      current.xcoords = [];    },    endText: function SVGGraphics_endText() {      if (this.current.pendingClip) {        this.cgrp.appendChild(this.tgrp);        this.pgrp.appendChild(this.cgrp);      } else {        this.pgrp.appendChild(this.tgrp);      }      this.tgrp = document.createElementNS(NS, 'svg:g');      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));    },    // Path properties    setLineWidth: function SVGGraphics_setLineWidth(width) {      this.current.lineWidth = width;    },    setLineCap: function SVGGraphics_setLineCap(style) {      this.current.lineCap = LINE_CAP_STYLES[style];    },    setLineJoin: function SVGGraphics_setLineJoin(style) {      this.current.lineJoin = LINE_JOIN_STYLES[style];    },    setMiterLimit: function SVGGraphics_setMiterLimit(limit) {      this.current.miterLimit = limit;    },    setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {      var color = Util.makeCssRgb(r, g, b);      this.current.strokeColor = color;    },    setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {      var color = Util.makeCssRgb(r, g, b);      this.current.fillColor = color;      this.current.tspan = document.createElementNS(NS, 'svg:tspan');      this.current.xcoords = [];    },    setDash: function SVGGraphics_setDash(dashArray, dashPhase) {      this.current.dashArray = dashArray;      this.current.dashPhase = dashPhase;    },    constructPath: function SVGGraphics_constructPath(ops, args) {      var current = this.current;      var x = current.x, y = current.y;      current.path = document.createElementNS(NS, 'svg:path');      var d = [];      var opLength = ops.length;      for (var i = 0, j = 0; i < opLength; i++) {        switch (ops[i] | 0) {          case OPS.rectangle:            x = args[j++];            y = args[j++];            var width = args[j++];            var height = args[j++];            var xw = x + width;            var yh = y + height;            d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh),                   'L', pf(x), pf(yh), 'Z');            break;          case OPS.moveTo:            x = args[j++];            y = args[j++];            d.push('M', pf(x), pf(y));            break;          case OPS.lineTo:            x = args[j++];            y = args[j++];            d.push('L', pf(x) , pf(y));            break;          case OPS.curveTo:            x = args[j + 4];            y = args[j + 5];            d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),                   pf(args[j + 3]), pf(x), pf(y));            j += 6;            break;          case OPS.curveTo2:            x = args[j + 2];            y = args[j + 3];            d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),                   pf(args[j + 2]), pf(args[j + 3]));            j += 4;            break;          case OPS.curveTo3:            x = args[j + 2];            y = args[j + 3];            d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),                   pf(x), pf(y));            j += 4;            break;          case OPS.closePath:            d.push('Z');            break;        }      }      current.path.setAttributeNS(null, 'd', d.join(' '));      current.path.setAttributeNS(null, 'stroke-miterlimit',                                  pf(current.miterLimit));      current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap);      current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);      current.path.setAttributeNS(null, 'stroke-width',                                  pf(current.lineWidth) + 'px');      current.path.setAttributeNS(null, 'stroke-dasharray',                                  current.dashArray.map(pf).join(' '));      current.path.setAttributeNS(null, 'stroke-dashoffset',                                  pf(current.dashPhase) + 'px');      current.path.setAttributeNS(null, 'fill', 'none');      this.tgrp.appendChild(current.path);      if (current.pendingClip) {        this.cgrp.appendChild(this.tgrp);        this.pgrp.appendChild(this.cgrp);      } else {        this.pgrp.appendChild(this.tgrp);      }      // Saving a reference in current.element so that it can be addressed      // in 'fill' and 'stroke'      current.element = current.path;      current.setCurrentPoint(x, y);    },    endPath: function SVGGraphics_endPath() {      var current = this.current;      if (current.pendingClip) {        this.cgrp.appendChild(this.tgrp);        this.pgrp.appendChild(this.cgrp);      } else {        this.pgrp.appendChild(this.tgrp);      }      this.tgrp = document.createElementNS(NS, 'svg:g');      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));    },    clip: function SVGGraphics_clip(type) {      var current = this.current;      // Add current path to clipping path      current.clipId = 'clippath' + clipCount;      clipCount++;      this.clippath = document.createElementNS(NS, 'svg:clipPath');      this.clippath.setAttributeNS(null, 'id', current.clipId);      var clipElement = current.element.cloneNode();      if (type === 'evenodd') {        clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');      } else {        clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');      }      this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));      this.clippath.appendChild(clipElement);      this.defs.appendChild(this.clippath);      // Create a new group with that attribute      current.pendingClip = true;      this.cgrp = document.createElementNS(NS, 'svg:g');      this.cgrp.setAttributeNS(null, 'clip-path',                               'url(#' + current.clipId + ')');      this.pgrp.appendChild(this.cgrp);    },    closePath: function SVGGraphics_closePath() {      var current = this.current;      var d = current.path.getAttributeNS(null, 'd');      d += 'Z';      current.path.setAttributeNS(null, 'd', d);    },    setLeading: function SVGGraphics_setLeading(leading) {      this.current.leading = -leading;    },    setTextRise: function SVGGraphics_setTextRise(textRise) {      this.current.textRise = textRise;    },    setHScale: function SVGGraphics_setHScale(scale) {      this.current.textHScale = scale / 100;    },    setGState: function SVGGraphics_setGState(states) {      for (var i = 0, ii = states.length; i < ii; i++) {        var state = states[i];        var key = state[0];        var value = state[1];        switch (key) {          case 'LW':            this.setLineWidth(value);            break;          case 'LC':            this.setLineCap(value);            break;          case 'LJ':            this.setLineJoin(value);            break;          case 'ML':            this.setMiterLimit(value);            break;          case 'D':            this.setDash(value[0], value[1]);            break;          case 'RI':            break;          case 'FL':            break;          case 'Font':            this.setFont(value);            break;          case 'CA':            break;          case 'ca':            break;          case 'BM':            break;          case 'SMask':            break;        }      }    },    fill: function SVGGraphics_fill() {      var current = this.current;      current.element.setAttributeNS(null, 'fill', current.fillColor);    },    stroke: function SVGGraphics_stroke() {      var current = this.current;      current.element.setAttributeNS(null, 'stroke', current.strokeColor);      current.element.setAttributeNS(null, 'fill', 'none');    },    eoFill: function SVGGraphics_eoFill() {      var current = this.current;      current.element.setAttributeNS(null, 'fill', current.fillColor);      current.element.setAttributeNS(null, 'fill-rule', 'evenodd');    },    fillStroke: function SVGGraphics_fillStroke() {      // Order is important since stroke wants fill to be none.      // First stroke, then if fill needed, it will be overwritten.      this.stroke();      this.fill();    },    eoFillStroke: function SVGGraphics_eoFillStroke() {      this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');      this.fillStroke();    },    closeStroke: function SVGGraphics_closeStroke() {      this.closePath();      this.stroke();    },    closeFillStroke: function SVGGraphics_closeFillStroke() {      this.closePath();      this.fillStroke();    },    paintSolidColorImageMask:        function SVGGraphics_paintSolidColorImageMask() {      var current = this.current;      var rect = document.createElementNS(NS, 'svg:rect');      rect.setAttributeNS(null, 'x', '0');      rect.setAttributeNS(null, 'y', '0');      rect.setAttributeNS(null, 'width', '1px');      rect.setAttributeNS(null, 'height', '1px');      rect.setAttributeNS(null, 'fill', current.fillColor);      this.tgrp.appendChild(rect);    },    paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {      var current = this.current;      var imgObj = this.objs.get(objId);      var imgEl = document.createElementNS(NS, 'svg:image');      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);      imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');      imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');      imgEl.setAttributeNS(null, 'x', '0');      imgEl.setAttributeNS(null, 'y', pf(-h));      imgEl.setAttributeNS(null, 'transform',                           'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');      this.tgrp.appendChild(imgEl);      if (current.pendingClip) {        this.cgrp.appendChild(this.tgrp);        this.pgrp.appendChild(this.cgrp);      } else {        this.pgrp.appendChild(this.tgrp);      }    },    paintImageXObject: function SVGGraphics_paintImageXObject(objId) {      var imgData = this.objs.get(objId);      if (!imgData) {        warn('Dependent image isn\'t ready yet');        return;      }      this.paintInlineImageXObject(imgData);    },    paintInlineImageXObject:        function SVGGraphics_paintInlineImageXObject(imgData, mask) {      var current = this.current;      var width = imgData.width;      var height = imgData.height;      var imgSrc = convertImgDataToPng(imgData);      var cliprect = document.createElementNS(NS, 'svg:rect');      cliprect.setAttributeNS(null, 'x', '0');      cliprect.setAttributeNS(null, 'y', '0');      cliprect.setAttributeNS(null, 'width', pf(width));      cliprect.setAttributeNS(null, 'height', pf(height));      current.element = cliprect;      this.clip('nonzero');      var imgEl = document.createElementNS(NS, 'svg:image');      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);      imgEl.setAttributeNS(null, 'x', '0');      imgEl.setAttributeNS(null, 'y', pf(-height));      imgEl.setAttributeNS(null, 'width', pf(width) + 'px');      imgEl.setAttributeNS(null, 'height', pf(height) + 'px');      imgEl.setAttributeNS(null, 'transform',                           'scale(' + pf(1 / width) + ' ' +                           pf(-1 / height) + ')');      if (mask) {        mask.appendChild(imgEl);      } else {        this.tgrp.appendChild(imgEl);      }      if (current.pendingClip) {        this.cgrp.appendChild(this.tgrp);        this.pgrp.appendChild(this.cgrp);      } else {        this.pgrp.appendChild(this.tgrp);      }    },    paintImageMaskXObject:        function SVGGraphics_paintImageMaskXObject(imgData) {      var current = this.current;      var width = imgData.width;      var height = imgData.height;      var fillColor = current.fillColor;      current.maskId = 'mask' + maskCount++;      var mask = document.createElementNS(NS, 'svg:mask');      mask.setAttributeNS(null, 'id', current.maskId);      var rect = document.createElementNS(NS, 'svg:rect');      rect.setAttributeNS(null, 'x', '0');      rect.setAttributeNS(null, 'y', '0');      rect.setAttributeNS(null, 'width', pf(width));      rect.setAttributeNS(null, 'height', pf(height));      rect.setAttributeNS(null, 'fill', fillColor);      rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')');      this.defs.appendChild(mask);      this.tgrp.appendChild(rect);      this.paintInlineImageXObject(imgData, mask);    },    paintFormXObjectBegin:        function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {      this.save();      if (isArray(matrix) && matrix.length === 6) {        this.transform(matrix[0], matrix[1], matrix[2],                       matrix[3], matrix[4], matrix[5]);      }      if (isArray(bbox) && bbox.length === 4) {        var width = bbox[2] - bbox[0];        var height = bbox[3] - bbox[1];        var cliprect = document.createElementNS(NS, 'svg:rect');        cliprect.setAttributeNS(null, 'x', bbox[0]);        cliprect.setAttributeNS(null, 'y', bbox[1]);        cliprect.setAttributeNS(null, 'width', pf(width));        cliprect.setAttributeNS(null, 'height', pf(height));        this.current.element = cliprect;        this.clip('nonzero');        this.endPath();      }    },    paintFormXObjectEnd:        function SVGGraphics_paintFormXObjectEnd() {      this.restore();    }  };  return SVGGraphics;})();PDFJS.SVGGraphics = SVGGraphics;exports.SVGGraphics = SVGGraphics;}));(function (root, factory) {  {    factory((root.pdfjsDisplayTextLayer = {}), root.pdfjsSharedUtil,      root.pdfjsDisplayDOMUtils, root.pdfjsSharedGlobal);  }}(this, function (exports, sharedUtil, displayDOMUtils, sharedGlobal) {var Util = sharedUtil.Util;var createPromiseCapability = sharedUtil.createPromiseCapability;var CustomStyle = displayDOMUtils.CustomStyle;var PDFJS = sharedGlobal.PDFJS;/** * Text layer render parameters. * * @typedef {Object} TextLayerRenderParameters * @property {TextContent} textContent - Text content to render (the object is *   returned by the page's getTextContent() method). * @property {HTMLElement} container - HTML element that will contain text runs. * @property {PDFJS.PageViewport} viewport - The target viewport to properly *   layout the text runs. * @property {Array} textDivs - (optional) HTML elements that are correspond *   the text items of the textContent input. This is output and shall be *   initially be set to empty array. * @property {number} timeout - (optional) Delay in milliseconds before *   rendering of the text  runs occurs. */var renderTextLayer = (function renderTextLayerClosure() {  var MAX_TEXT_DIVS_TO_RENDER = 100000;  var NonWhitespaceRegexp = /\S/;  function isAllWhitespace(str) {    return !NonWhitespaceRegexp.test(str);  }  function appendText(textDivs, viewport, geom, styles) {    var style = styles[geom.fontName];    var textDiv = document.createElement('div');    textDivs.push(textDiv);    if (isAllWhitespace(geom.str)) {      textDiv.dataset.isWhitespace = true;      return;    }    var tx = Util.transform(viewport.transform, geom.transform);    var angle = Math.atan2(tx[1], tx[0]);    if (style.vertical) {      angle += Math.PI / 2;    }    var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));    var fontAscent = fontHeight;    if (style.ascent) {      fontAscent = style.ascent * fontAscent;    } else if (style.descent) {      fontAscent = (1 + style.descent) * fontAscent;    }    var left;    var top;    if (angle === 0) {      left = tx[4];      top = tx[5] - fontAscent;    } else {      left = tx[4] + (fontAscent * Math.sin(angle));      top = tx[5] - (fontAscent * Math.cos(angle));    }    textDiv.style.left = left + 'px';    textDiv.style.top = top + 'px';    textDiv.style.fontSize = fontHeight + 'px';    textDiv.style.fontFamily = style.fontFamily;    textDiv.textContent = geom.str;    // |fontName| is only used by the Font Inspector. This test will succeed    // when e.g. the Font Inspector is off but the Stepper is on, but it's    // not worth the effort to do a more accurate test.    if (PDFJS.pdfBug) {      textDiv.dataset.fontName = geom.fontName;    }    // Storing into dataset will convert number into string.    if (angle !== 0) {      textDiv.dataset.angle = angle * (180 / Math.PI);    }    // We don't bother scaling single-char text divs, because it has very    // little effect on text highlighting. This makes scrolling on docs with    // lots of such divs a lot faster.    if (geom.str.length > 1) {      if (style.vertical) {        textDiv.dataset.canvasWidth = geom.height * viewport.scale;      } else {        textDiv.dataset.canvasWidth = geom.width * viewport.scale;      }    }  }  function render(task) {    if (task._canceled) {      return;    }    var textLayerFrag = task._container;    var textDivs = task._textDivs;    var capability = task._capability;    var textDivsLength = textDivs.length;    // No point in rendering many divs as it would make the browser    // unusable even after the divs are rendered.    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {      capability.resolve();      return;    }    var canvas = document.createElement('canvas');    canvas.mozOpaque = true;    var ctx = canvas.getContext('2d', {alpha: false});    var lastFontSize;    var lastFontFamily;    for (var i = 0; i < textDivsLength; i++) {      var textDiv = textDivs[i];      if (textDiv.dataset.isWhitespace !== undefined) {        continue;      }      var fontSize = textDiv.style.fontSize;      var fontFamily = textDiv.style.fontFamily;      // Only build font string and set to context if different from last.      if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) {        ctx.font = fontSize + ' ' + fontFamily;        lastFontSize = fontSize;        lastFontFamily = fontFamily;      }      var width = ctx.measureText(textDiv.textContent).width;      if (width > 0) {        textLayerFrag.appendChild(textDiv);        var transform;        if (textDiv.dataset.canvasWidth !== undefined) {          // Dataset values come of type string.          var textScale = textDiv.dataset.canvasWidth / width;          transform = 'scaleX(' + textScale + ')';        } else {          transform = '';        }        var rotation = textDiv.dataset.angle;        if (rotation) {          transform = 'rotate(' + rotation + 'deg) ' + transform;        }        if (transform) {          CustomStyle.setProp('transform' , textDiv, transform);        }      }    }    capability.resolve();  }  /**   * Text layer rendering task.   *   * @param {TextContent} textContent   * @param {HTMLElement} container   * @param {PDFJS.PageViewport} viewport   * @param {Array} textDivs   * @private   */  function TextLayerRenderTask(textContent, container, viewport, textDivs) {    this._textContent = textContent;    this._container = container;    this._viewport = viewport;    textDivs = textDivs || [];    this._textDivs = textDivs;    this._canceled = false;    this._capability = createPromiseCapability();    this._renderTimer = null;  }  TextLayerRenderTask.prototype = {    get promise() {      return this._capability.promise;    },    cancel: function TextLayer_cancel() {      this._canceled = true;      if (this._renderTimer !== null) {        clearTimeout(this._renderTimer);        this._renderTimer = null;      }      this._capability.reject('canceled');    },    _render: function TextLayer_render(timeout) {      var textItems = this._textContent.items;      var styles = this._textContent.styles;      var textDivs = this._textDivs;      var viewport = this._viewport;      for (var i = 0, len = textItems.length; i < len; i++) {        appendText(textDivs, viewport, textItems[i], styles);      }      if (!timeout) { // Render right away        render(this);      } else { // Schedule        var self = this;        this._renderTimer = setTimeout(function() {          render(self);          self._renderTimer = null;        }, timeout);      }    }  };  /**   * Starts rendering of the text layer.   *   * @param {TextLayerRenderParameters} renderParameters   * @returns {TextLayerRenderTask}   */  function renderTextLayer(renderParameters) {    var task = new TextLayerRenderTask(renderParameters.textContent,                                       renderParameters.container,                                       renderParameters.viewport,                                       renderParameters.textDivs);    task._render(renderParameters.timeout);    return task;  }  return renderTextLayer;})();PDFJS.renderTextLayer = renderTextLayer;exports.renderTextLayer = renderTextLayer;}));(function (root, factory) {  {    factory((root.pdfjsDisplayWebGL = {}), root.pdfjsSharedUtil);  }}(this, function (exports, sharedUtil) {var shadow = sharedUtil.shadow;var WebGLUtils = (function WebGLUtilsClosure() {  function loadShader(gl, code, shaderType) {    var shader = gl.createShader(shaderType);    gl.shaderSource(shader, code);    gl.compileShader(shader);    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);    if (!compiled) {      var errorMsg = gl.getShaderInfoLog(shader);      throw new Error('Error during shader compilation: ' + errorMsg);    }    return shader;  }  function createVertexShader(gl, code) {    return loadShader(gl, code, gl.VERTEX_SHADER);  }  function createFragmentShader(gl, code) {    return loadShader(gl, code, gl.FRAGMENT_SHADER);  }  function createProgram(gl, shaders) {    var program = gl.createProgram();    for (var i = 0, ii = shaders.length; i < ii; ++i) {      gl.attachShader(program, shaders[i]);    }    gl.linkProgram(program);    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);    if (!linked) {      var errorMsg = gl.getProgramInfoLog(program);      throw new Error('Error during program linking: ' + errorMsg);    }    return program;  }  function createTexture(gl, image, textureId) {    gl.activeTexture(textureId);    var texture = gl.createTexture();    gl.bindTexture(gl.TEXTURE_2D, texture);    // Set the parameters so we can render any size image.    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);    // Upload the image into the texture.    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);    return texture;  }  var currentGL, currentCanvas;  function generateGL() {    if (currentGL) {      return;    }    currentCanvas = document.createElement('canvas');    currentGL = currentCanvas.getContext('webgl',      { premultipliedalpha: false });  }  var smaskVertexShaderCode = '\  attribute vec2 a_position;                                    \  attribute vec2 a_texCoord;                                    \                                                                \  uniform vec2 u_resolution;                                    \                                                                \  varying vec2 v_texCoord;                                      \                                                                \  void main() {                                                 \    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \                                                                \    v_texCoord = a_texCoord;                                    \  }                                                             ';  var smaskFragmentShaderCode = '\  precision mediump float;                                      \                                                                \  uniform vec4 u_backdrop;                                      \  uniform int u_subtype;                                        \  uniform sampler2D u_image;                                    \  uniform sampler2D u_mask;                                     \                                                                \  varying vec2 v_texCoord;                                      \                                                                \  void main() {                                                 \    vec4 imageColor = texture2D(u_image, v_texCoord);           \    vec4 maskColor = texture2D(u_mask, v_texCoord);             \    if (u_backdrop.a > 0.0) {                                   \      maskColor.rgb = maskColor.rgb * maskColor.a +             \                      u_backdrop.rgb * (1.0 - maskColor.a);     \    }                                                           \    float lum;                                                  \    if (u_subtype == 0) {                                       \      lum = maskColor.a;                                        \    } else {                                                    \      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \            maskColor.b * 0.11;                                 \    }                                                           \    imageColor.a *= lum;                                        \    imageColor.rgb *= imageColor.a;                             \    gl_FragColor = imageColor;                                  \  }                                                             ';  var smaskCache = null;  function initSmaskGL() {    var canvas, gl;    generateGL();    canvas = currentCanvas;    currentCanvas = null;    gl = currentGL;    currentGL = null;    // setup a GLSL program    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);    var program = createProgram(gl, [vertexShader, fragmentShader]);    gl.useProgram(program);    var cache = {};    cache.gl = gl;    cache.canvas = canvas;    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');    cache.positionLocation = gl.getAttribLocation(program, 'a_position');    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');    var texLayerLocation = gl.getUniformLocation(program, 'u_image');    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');    // provide texture coordinates for the rectangle.    var texCoordBuffer = gl.createBuffer();    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([      0.0,  0.0,      1.0,  0.0,      0.0,  1.0,      0.0,  1.0,      1.0,  0.0,      1.0,  1.0]), gl.STATIC_DRAW);    gl.enableVertexAttribArray(texCoordLocation);    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);    gl.uniform1i(texLayerLocation, 0);    gl.uniform1i(texMaskLocation, 1);    smaskCache = cache;  }  function composeSMask(layer, mask, properties) {    var width = layer.width, height = layer.height;    if (!smaskCache) {      initSmaskGL();    }    var cache = smaskCache,canvas = cache.canvas, gl = cache.gl;    canvas.width = width;    canvas.height = height;    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);    gl.uniform2f(cache.resolutionLocation, width, height);    if (properties.backdrop) {      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],                   properties.backdrop[1], properties.backdrop[2], 1);    } else {      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);    }    gl.uniform1i(cache.subtypeLocation,                 properties.subtype === 'Luminosity' ? 1 : 0);    // Create a textures    var texture = createTexture(gl, layer, gl.TEXTURE0);    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);    // Create a buffer and put a single clipspace rectangle in    // it (2 triangles)    var buffer = gl.createBuffer();    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([      0, 0,      width, 0,      0, height,      0, height,      width, 0,      width, height]), gl.STATIC_DRAW);    gl.enableVertexAttribArray(cache.positionLocation);    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);    // draw    gl.clearColor(0, 0, 0, 0);    gl.enable(gl.BLEND);    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);    gl.clear(gl.COLOR_BUFFER_BIT);    gl.drawArrays(gl.TRIANGLES, 0, 6);    gl.flush();    gl.deleteTexture(texture);    gl.deleteTexture(maskTexture);    gl.deleteBuffer(buffer);    return canvas;  }  var figuresVertexShaderCode = '\  attribute vec2 a_position;                                    \  attribute vec3 a_color;                                       \                                                                \  uniform vec2 u_resolution;                                    \  uniform vec2 u_scale;                                         \  uniform vec2 u_offset;                                        \                                                                \  varying vec4 v_color;                                         \                                                                \  void main() {                                                 \    vec2 position = (a_position + u_offset) * u_scale;          \    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \                                                                \    v_color = vec4(a_color / 255.0, 1.0);                       \  }                                                             ';  var figuresFragmentShaderCode = '\  precision mediump float;                                      \                                                                \  varying vec4 v_color;                                         \                                                                \  void main() {                                                 \    gl_FragColor = v_color;                                     \  }                                                             ';  var figuresCache = null;  function initFiguresGL() {    var canvas, gl;    generateGL();    canvas = currentCanvas;    currentCanvas = null;    gl = currentGL;    currentGL = null;    // setup a GLSL program    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);    var program = createProgram(gl, [vertexShader, fragmentShader]);    gl.useProgram(program);    var cache = {};    cache.gl = gl;    cache.canvas = canvas;    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');    cache.positionLocation = gl.getAttribLocation(program, 'a_position');    cache.colorLocation = gl.getAttribLocation(program, 'a_color');    figuresCache = cache;  }  function drawFigures(width, height, backgroundColor, figures, context) {    if (!figuresCache) {      initFiguresGL();    }    var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;    canvas.width = width;    canvas.height = height;    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);    gl.uniform2f(cache.resolutionLocation, width, height);    // count triangle points    var count = 0;    var i, ii, rows;    for (i = 0, ii = figures.length; i < ii; i++) {      switch (figures[i].type) {        case 'lattice':          rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;          break;        case 'triangles':          count += figures[i].coords.length;          break;      }    }    // transfer data    var coords = new Float32Array(count * 2);    var colors = new Uint8Array(count * 3);    var coordsMap = context.coords, colorsMap = context.colors;    var pIndex = 0, cIndex = 0;    for (i = 0, ii = figures.length; i < ii; i++) {      var figure = figures[i], ps = figure.coords, cs = figure.colors;      switch (figure.type) {        case 'lattice':          var cols = figure.verticesPerRow;          rows = (ps.length / cols) | 0;          for (var row = 1; row < rows; row++) {            var offset = row * cols + 1;            for (var col = 1; col < cols; col++, offset++) {              coords[pIndex] = coordsMap[ps[offset - cols - 1]];              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];              coords[pIndex + 2] = coordsMap[ps[offset - cols]];              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];              coords[pIndex + 4] = coordsMap[ps[offset - 1]];              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];              colors[cIndex] = colorsMap[cs[offset - cols - 1]];              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];              colors[cIndex + 3] = colorsMap[cs[offset - cols]];              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];              colors[cIndex + 6] = colorsMap[cs[offset - 1]];              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];              coords[pIndex + 6] = coords[pIndex + 2];              coords[pIndex + 7] = coords[pIndex + 3];              coords[pIndex + 8] = coords[pIndex + 4];              coords[pIndex + 9] = coords[pIndex + 5];              coords[pIndex + 10] = coordsMap[ps[offset]];              coords[pIndex + 11] = coordsMap[ps[offset] + 1];              colors[cIndex + 9] = colors[cIndex + 3];              colors[cIndex + 10] = colors[cIndex + 4];              colors[cIndex + 11] = colors[cIndex + 5];              colors[cIndex + 12] = colors[cIndex + 6];              colors[cIndex + 13] = colors[cIndex + 7];              colors[cIndex + 14] = colors[cIndex + 8];              colors[cIndex + 15] = colorsMap[cs[offset]];              colors[cIndex + 16] = colorsMap[cs[offset] + 1];              colors[cIndex + 17] = colorsMap[cs[offset] + 2];              pIndex += 12;              cIndex += 18;            }          }          break;        case 'triangles':          for (var j = 0, jj = ps.length; j < jj; j++) {            coords[pIndex] = coordsMap[ps[j]];            coords[pIndex + 1] = coordsMap[ps[j] + 1];            colors[cIndex] = colorsMap[cs[j]];            colors[cIndex + 1] = colorsMap[cs[j] + 1];            colors[cIndex + 2] = colorsMap[cs[j] + 2];            pIndex += 2;            cIndex += 3;          }          break;      }    }    // draw    if (backgroundColor) {      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,                    backgroundColor[2] / 255, 1.0);    } else {      gl.clearColor(0, 0, 0, 0);    }    gl.clear(gl.COLOR_BUFFER_BIT);    var coordsBuffer = gl.createBuffer();    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);    gl.enableVertexAttribArray(cache.positionLocation);    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);    var colorsBuffer = gl.createBuffer();    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);    gl.enableVertexAttribArray(cache.colorLocation);    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,                           0, 0);    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);    gl.drawArrays(gl.TRIANGLES, 0, count);    gl.flush();    gl.deleteBuffer(coordsBuffer);    gl.deleteBuffer(colorsBuffer);    return canvas;  }  function cleanup() {    if (smaskCache && smaskCache.canvas) {      smaskCache.canvas.width = 0;      smaskCache.canvas.height = 0;    }    if (figuresCache && figuresCache.canvas) {      figuresCache.canvas.width = 0;      figuresCache.canvas.height = 0;    }    smaskCache = null;    figuresCache = null;  }  return {    get isEnabled() {      if (PDFJS.disableWebGL) {        return false;      }      var enabled = false;      try {        generateGL();        enabled = !!currentGL;      } catch (e) { }      return shadow(this, 'isEnabled', enabled);    },    composeSMask: composeSMask,    drawFigures: drawFigures,    clear: cleanup  };})();exports.WebGLUtils = WebGLUtils;}));(function (root, factory) {  {    factory((root.pdfjsDisplayPatternHelper = {}), root.pdfjsSharedUtil,      root.pdfjsDisplayWebGL);  }}(this, function (exports, sharedUtil, displayWebGL) {var Util = sharedUtil.Util;var info = sharedUtil.info;var isArray = sharedUtil.isArray;var error = sharedUtil.error;var WebGLUtils = displayWebGL.WebGLUtils;var ShadingIRs = {};ShadingIRs.RadialAxial = {  fromIR: function RadialAxial_fromIR(raw) {    var type = raw[1];    var colorStops = raw[2];    var p0 = raw[3];    var p1 = raw[4];    var r0 = raw[5];    var r1 = raw[6];    return {      type: 'Pattern',      getPattern: function RadialAxial_getPattern(ctx) {        var grad;        if (type === 'axial') {          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);        } else if (type === 'radial') {          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);        }        for (var i = 0, ii = colorStops.length; i < ii; ++i) {          var c = colorStops[i];          grad.addColorStop(c[0], c[1]);        }        return grad;      }    };  }};var createMeshCanvas = (function createMeshCanvasClosure() {  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {    // Very basic Gouraud-shaded triangle rasterization algorithm.    var coords = context.coords, colors = context.colors;    var bytes = data.data, rowSize = data.width * 4;    var tmp;    if (coords[p1 + 1] > coords[p2 + 1]) {      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;    }    if (coords[p2 + 1] > coords[p3 + 1]) {      tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;    }    if (coords[p1 + 1] > coords[p2 + 1]) {      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;    }    var x1 = (coords[p1] + context.offsetX) * context.scaleX;    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;    var x2 = (coords[p2] + context.offsetX) * context.scaleX;    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;    var x3 = (coords[p3] + context.offsetX) * context.scaleX;    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;    if (y1 >= y3) {      return;    }    var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];    var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];    var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];    var minY = Math.round(y1), maxY = Math.round(y3);    var xa, car, cag, cab;    var xb, cbr, cbg, cbb;    var k;    for (var y = minY; y <= maxY; y++) {      if (y < y2) {        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);        xa = x1 - (x1 - x2) * k;        car = c1r - (c1r - c2r) * k;        cag = c1g - (c1g - c2g) * k;        cab = c1b - (c1b - c2b) * k;      } else {        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);        xa = x2 - (x2 - x3) * k;        car = c2r - (c2r - c3r) * k;        cag = c2g - (c2g - c3g) * k;        cab = c2b - (c2b - c3b) * k;      }      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);      xb = x1 - (x1 - x3) * k;      cbr = c1r - (c1r - c3r) * k;      cbg = c1g - (c1g - c3g) * k;      cbb = c1b - (c1b - c3b) * k;      var x1_ = Math.round(Math.min(xa, xb));      var x2_ = Math.round(Math.max(xa, xb));      var j = rowSize * y + x1_ * 4;      for (var x = x1_; x <= x2_; x++) {        k = (xa - x) / (xa - xb);        k = k < 0 ? 0 : k > 1 ? 1 : k;        bytes[j++] = (car - (car - cbr) * k) | 0;        bytes[j++] = (cag - (cag - cbg) * k) | 0;        bytes[j++] = (cab - (cab - cbb) * k) | 0;        bytes[j++] = 255;      }    }  }  function drawFigure(data, figure, context) {    var ps = figure.coords;    var cs = figure.colors;    var i, ii;    switch (figure.type) {      case 'lattice':        var verticesPerRow = figure.verticesPerRow;        var rows = Math.floor(ps.length / verticesPerRow) - 1;        var cols = verticesPerRow - 1;        for (i = 0; i < rows; i++) {          var q = i * verticesPerRow;          for (var j = 0; j < cols; j++, q++) {            drawTriangle(data, context,              ps[q], ps[q + 1], ps[q + verticesPerRow],              cs[q], cs[q + 1], cs[q + verticesPerRow]);            drawTriangle(data, context,              ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],              cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);          }        }        break;      case 'triangles':        for (i = 0, ii = ps.length; i < ii; i += 3) {          drawTriangle(data, context,            ps[i], ps[i + 1], ps[i + 2],            cs[i], cs[i + 1], cs[i + 2]);        }        break;      default:        error('illigal figure');        break;    }  }  function createMeshCanvas(bounds, combinesScale, coords, colors, figures,                            backgroundColor, cachedCanvases) {    // we will increase scale on some weird factor to let antialiasing take    // care of "rough" edges    var EXPECTED_SCALE = 1.1;    // MAX_PATTERN_SIZE is used to avoid OOM situation.    var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough    var offsetX = Math.floor(bounds[0]);    var offsetY = Math.floor(bounds[1]);    var boundsWidth = Math.ceil(bounds[2]) - offsetX;    var boundsHeight = Math.ceil(bounds[3]) - offsetY;    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *      EXPECTED_SCALE)), MAX_PATTERN_SIZE);    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *      EXPECTED_SCALE)), MAX_PATTERN_SIZE);    var scaleX = boundsWidth / width;    var scaleY = boundsHeight / height;    var context = {      coords: coords,      colors: colors,      offsetX: -offsetX,      offsetY: -offsetY,      scaleX: 1 / scaleX,      scaleY: 1 / scaleY    };    var canvas, tmpCanvas, i, ii;    if (WebGLUtils.isEnabled) {      canvas = WebGLUtils.drawFigures(width, height, backgroundColor,                                      figures, context);      // https://bugzilla.mozilla.org/show_bug.cgi?id=972126      tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);      tmpCanvas.context.drawImage(canvas, 0, 0);      canvas = tmpCanvas.canvas;    } else {      tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);      var tmpCtx = tmpCanvas.context;      var data = tmpCtx.createImageData(width, height);      if (backgroundColor) {        var bytes = data.data;        for (i = 0, ii = bytes.length; i < ii; i += 4) {          bytes[i] = backgroundColor[0];          bytes[i + 1] = backgroundColor[1];          bytes[i + 2] = backgroundColor[2];          bytes[i + 3] = 255;        }      }      for (i = 0; i < figures.length; i++) {        drawFigure(data, figures[i], context);      }      tmpCtx.putImageData(data, 0, 0);      canvas = tmpCanvas.canvas;    }    return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,            scaleX: scaleX, scaleY: scaleY};  }  return createMeshCanvas;})();ShadingIRs.Mesh = {  fromIR: function Mesh_fromIR(raw) {    //var type = raw[1];    var coords = raw[2];    var colors = raw[3];    var figures = raw[4];    var bounds = raw[5];    var matrix = raw[6];    //var bbox = raw[7];    var background = raw[8];    return {      type: 'Pattern',      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {        var scale;        if (shadingFill) {          scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);        } else {          // Obtain scale from matrix and current transformation matrix.          scale = Util.singularValueDecompose2dScale(owner.baseTransform);          if (matrix) {            var matrixScale = Util.singularValueDecompose2dScale(matrix);            scale = [scale[0] * matrixScale[0],                     scale[1] * matrixScale[1]];          }        }        // Rasterizing on the main thread since sending/queue large canvases        // might cause OOM.        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,          colors, figures, shadingFill ? null : background,          owner.cachedCanvases);        if (!shadingFill) {          ctx.setTransform.apply(ctx, owner.baseTransform);          if (matrix) {            ctx.transform.apply(ctx, matrix);          }        }        ctx.translate(temporaryPatternCanvas.offsetX,                      temporaryPatternCanvas.offsetY);        ctx.scale(temporaryPatternCanvas.scaleX,                  temporaryPatternCanvas.scaleY);        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');      }    };  }};ShadingIRs.Dummy = {  fromIR: function Dummy_fromIR() {    return {      type: 'Pattern',      getPattern: function Dummy_fromIR_getPattern() {        return 'hotpink';      }    };  }};function getShadingPatternFromIR(raw) {  var shadingIR = ShadingIRs[raw[0]];  if (!shadingIR) {    error('Unknown IR type: ' + raw[0]);  }  return shadingIR.fromIR(raw);}var TilingPattern = (function TilingPatternClosure() {  var PaintType = {    COLORED: 1,    UNCOLORED: 2  };  var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {    this.operatorList = IR[2];    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];    this.bbox = IR[4];    this.xstep = IR[5];    this.ystep = IR[6];    this.paintType = IR[7];    this.tilingType = IR[8];    this.color = color;    this.canvasGraphicsFactory = canvasGraphicsFactory;    this.baseTransform = baseTransform;    this.type = 'Pattern';    this.ctx = ctx;  }  TilingPattern.prototype = {    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {      var operatorList = this.operatorList;      var bbox = this.bbox;      var xstep = this.xstep;      var ystep = this.ystep;      var paintType = this.paintType;      var tilingType = this.tilingType;      var color = this.color;      var canvasGraphicsFactory = this.canvasGraphicsFactory;      info('TilingType: ' + tilingType);      var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];      var topLeft = [x0, y0];      // we want the canvas to be as large as the step size      var botRight = [x0 + xstep, y0 + ystep];      var width = botRight[0] - topLeft[0];      var height = botRight[1] - topLeft[1];      // Obtain scale from matrix and current transformation matrix.      var matrixScale = Util.singularValueDecompose2dScale(this.matrix);      var curMatrixScale = Util.singularValueDecompose2dScale(        this.baseTransform);      var combinedScale = [matrixScale[0] * curMatrixScale[0],        matrixScale[1] * curMatrixScale[1]];      // MAX_PATTERN_SIZE is used to avoid OOM situation.      // Use width and height values that are as close as possible to the end      // result when the pattern is used. Too low value makes the pattern look      // blurry. Too large value makes it look too crispy.      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),        MAX_PATTERN_SIZE);      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),        MAX_PATTERN_SIZE);      var tmpCanvas = owner.cachedCanvases.getCanvas('pattern',        width, height, true);      var tmpCtx = tmpCanvas.context;      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);      graphics.groupLevel = owner.groupLevel;      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);      this.setScale(width, height, xstep, ystep);      this.transformToScale(graphics);      // transform coordinates to pattern space      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];      graphics.transform.apply(graphics, tmpTranslate);      this.clipBbox(graphics, bbox, x0, y0, x1, y1);      graphics.executeOperatorList(operatorList);      return tmpCanvas.canvas;    },    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {      this.scale = [width / xstep, height / ystep];    },    transformToScale: function TilingPattern_transformToScale(graphics) {      var scale = this.scale;      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];      graphics.transform.apply(graphics, tmpScale);    },    scaleToContext: function TilingPattern_scaleToContext() {      var scale = this.scale;      this.ctx.scale(1 / scale[0], 1 / scale[1]);    },    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {      if (bbox && isArray(bbox) && bbox.length === 4) {        var bboxWidth = x1 - x0;        var bboxHeight = y1 - y0;        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);        graphics.clip();        graphics.endPath();      }    },    setFillAndStrokeStyleToContext:      function setFillAndStrokeStyleToContext(context, paintType, color) {        switch (paintType) {          case PaintType.COLORED:            var ctx = this.ctx;            context.fillStyle = ctx.fillStyle;            context.strokeStyle = ctx.strokeStyle;            break;          case PaintType.UNCOLORED:            var cssColor = Util.makeCssRgb(color[0], color[1], color[2]);            context.fillStyle = cssColor;            context.strokeStyle = cssColor;            break;          default:            error('Unsupported paint type: ' + paintType);        }      },    getPattern: function TilingPattern_getPattern(ctx, owner) {      var temporaryPatternCanvas = this.createPatternCanvas(owner);      ctx = this.ctx;      ctx.setTransform.apply(ctx, this.baseTransform);      ctx.transform.apply(ctx, this.matrix);      this.scaleToContext();      return ctx.createPattern(temporaryPatternCanvas, 'repeat');    }  };  return TilingPattern;})();exports.getShadingPatternFromIR = getShadingPatternFromIR;exports.TilingPattern = TilingPattern;}));(function (root, factory) {  {    factory((root.pdfjsDisplayCanvas = {}), root.pdfjsSharedUtil,      root.pdfjsDisplayPatternHelper, root.pdfjsDisplayWebGL);  }}(this, function (exports, sharedUtil, displayPatternHelper, displayWebGL) {var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX;var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX;var ImageKind = sharedUtil.ImageKind;var OPS = sharedUtil.OPS;var TextRenderingMode = sharedUtil.TextRenderingMode;var Uint32ArrayView = sharedUtil.Uint32ArrayView;var Util = sharedUtil.Util;var assert = sharedUtil.assert;var info = sharedUtil.info;var isNum = sharedUtil.isNum;var isArray = sharedUtil.isArray;var error = sharedUtil.error;var shadow = sharedUtil.shadow;var warn = sharedUtil.warn;var TilingPattern = displayPatternHelper.TilingPattern;var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR;var WebGLUtils = displayWebGL.WebGLUtils;// <canvas> contexts store most of the state we need natively.// However, PDF needs a bit more state, which we store here.// Minimal font size that would be used during canvas fillText operations.var MIN_FONT_SIZE = 16;// Maximum font size that would be used during canvas fillText operations.var MAX_FONT_SIZE = 100;var MAX_GROUP_SIZE = 4096;// Heuristic value used when enforcing minimum line widths.var MIN_WIDTH_FACTOR = 0.65;var COMPILE_TYPE3_GLYPHS = true;var MAX_SIZE_TO_COMPILE = 1000;var FULL_CHUNK_HEIGHT = 16;function createScratchCanvas(width, height) {  var canvas = document.createElement('canvas');  canvas.width = width;  canvas.height = height;  return canvas;}function addContextCurrentTransform(ctx) {  // If the context doesn't expose a `mozCurrentTransform`, add a JS based one.  if (!ctx.mozCurrentTransform) {    ctx._originalSave = ctx.save;    ctx._originalRestore = ctx.restore;    ctx._originalRotate = ctx.rotate;    ctx._originalScale = ctx.scale;    ctx._originalTranslate = ctx.translate;    ctx._originalTransform = ctx.transform;    ctx._originalSetTransform = ctx.setTransform;    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];    ctx._transformStack = [];    Object.defineProperty(ctx, 'mozCurrentTransform', {      get: function getCurrentTransform() {        return this._transformMatrix;      }    });    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {      get: function getCurrentTransformInverse() {        // Calculation done using WolframAlpha:        // http://www.wolframalpha.com/input/?        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}        var m = this._transformMatrix;        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];        var ad_bc = a * d - b * c;        var bc_ad = b * c - a * d;        return [          d / ad_bc,          b / bc_ad,          c / bc_ad,          a / ad_bc,          (d * e - c * f) / bc_ad,          (b * e - a * f) / ad_bc        ];      }    });    ctx.save = function ctxSave() {      var old = this._transformMatrix;      this._transformStack.push(old);      this._transformMatrix = old.slice(0, 6);      this._originalSave();    };    ctx.restore = function ctxRestore() {      var prev = this._transformStack.pop();      if (prev) {        this._transformMatrix = prev;        this._originalRestore();      }    };    ctx.translate = function ctxTranslate(x, y) {      var m = this._transformMatrix;      m[4] = m[0] * x + m[2] * y + m[4];      m[5] = m[1] * x + m[3] * y + m[5];      this._originalTranslate(x, y);    };    ctx.scale = function ctxScale(x, y) {      var m = this._transformMatrix;      m[0] = m[0] * x;      m[1] = m[1] * x;      m[2] = m[2] * y;      m[3] = m[3] * y;      this._originalScale(x, y);    };    ctx.transform = function ctxTransform(a, b, c, d, e, f) {      var m = this._transformMatrix;      this._transformMatrix = [        m[0] * a + m[2] * b,        m[1] * a + m[3] * b,        m[0] * c + m[2] * d,        m[1] * c + m[3] * d,        m[0] * e + m[2] * f + m[4],        m[1] * e + m[3] * f + m[5]      ];      ctx._originalTransform(a, b, c, d, e, f);    };    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {      this._transformMatrix = [a, b, c, d, e, f];      ctx._originalSetTransform(a, b, c, d, e, f);    };    ctx.rotate = function ctxRotate(angle) {      var cosValue = Math.cos(angle);      var sinValue = Math.sin(angle);      var m = this._transformMatrix;      this._transformMatrix = [        m[0] * cosValue + m[2] * sinValue,        m[1] * cosValue + m[3] * sinValue,        m[0] * (-sinValue) + m[2] * cosValue,        m[1] * (-sinValue) + m[3] * cosValue,        m[4],        m[5]      ];      this._originalRotate(angle);    };  }}var CachedCanvases = (function CachedCanvasesClosure() {  function CachedCanvases() {    this.cache = Object.create(null);  }  CachedCanvases.prototype = {    getCanvas: function CachedCanvases_getCanvas(id, width, height,                                                 trackTransform) {      var canvasEntry;      if (this.cache[id] !== undefined) {        canvasEntry = this.cache[id];        canvasEntry.canvas.width = width;        canvasEntry.canvas.height = height;        // reset canvas transform for emulated mozCurrentTransform, if needed        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);      } else {        var canvas = createScratchCanvas(width, height);        var ctx = canvas.getContext('2d');        if (trackTransform) {          addContextCurrentTransform(ctx);        }        this.cache[id] = canvasEntry = {canvas: canvas, context: ctx};      }      return canvasEntry;    },    clear: function () {      for (var id in this.cache) {        var canvasEntry = this.cache[id];        // Zeroing the width and height causes Firefox to release graphics        // resources immediately, which can greatly reduce memory consumption.        canvasEntry.canvas.width = 0;        canvasEntry.canvas.height = 0;        delete this.cache[id];      }    }  };  return CachedCanvases;})();function compileType3Glyph(imgData) {  var POINT_TO_PROCESS_LIMIT = 1000;  var width = imgData.width, height = imgData.height;  var i, j, j0, width1 = width + 1;  var points = new Uint8Array(width1 * (height + 1));  var POINT_TYPES =      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);  // decodes bit-packed mask data  var lineSize = (width + 7) & ~7, data0 = imgData.data;  var data = new Uint8Array(lineSize * height), pos = 0, ii;  for (i = 0, ii = data0.length; i < ii; i++) {    var mask = 128, elem = data0[i];    while (mask > 0) {      data[pos++] = (elem & mask) ? 0 : 255;      mask >>= 1;    }  }  // finding iteresting points: every point is located between mask pixels,  // so there will be points of the (width + 1)x(height + 1) grid. Every point  // will have flags assigned based on neighboring mask pixels:  //   4 | 8  //   --P--  //   2 | 1  // We are interested only in points with the flags:  //   - outside corners: 1, 2, 4, 8;  //   - inside corners: 7, 11, 13, 14;  //   - and, intersections: 5, 10.  var count = 0;  pos = 0;  if (data[pos] !== 0) {    points[0] = 1;    ++count;  }  for (j = 1; j < width; j++) {    if (data[pos] !== data[pos + 1]) {      points[j] = data[pos] ? 2 : 1;      ++count;    }    pos++;  }  if (data[pos] !== 0) {    points[j] = 2;    ++count;  }  for (i = 1; i < height; i++) {    pos = i * lineSize;    j0 = i * width1;    if (data[pos - lineSize] !== data[pos]) {      points[j0] = data[pos] ? 1 : 8;      ++count;    }    // 'sum' is the position of the current pixel configuration in the 'TYPES'    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);    for (j = 1; j < width; j++) {      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +            (data[pos - lineSize + 1] ? 8 : 0);      if (POINT_TYPES[sum]) {        points[j0 + j] = POINT_TYPES[sum];        ++count;      }      pos++;    }    if (data[pos - lineSize] !== data[pos]) {      points[j0 + j] = data[pos] ? 2 : 4;      ++count;    }    if (count > POINT_TO_PROCESS_LIMIT) {      return null;    }  }  pos = lineSize * (height - 1);  j0 = i * width1;  if (data[pos] !== 0) {    points[j0] = 8;    ++count;  }  for (j = 1; j < width; j++) {    if (data[pos] !== data[pos + 1]) {      points[j0 + j] = data[pos] ? 4 : 8;      ++count;    }    pos++;  }  if (data[pos] !== 0) {    points[j0 + j] = 4;    ++count;  }  if (count > POINT_TO_PROCESS_LIMIT) {    return null;  }  // building outlines  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);  var outlines = [];  for (i = 0; count && i <= height; i++) {    var p = i * width1;    var end = p + width;    while (p < end && !points[p]) {      p++;    }    if (p === end) {      continue;    }    var coords = [p % width1, i];    var type = points[p], p0 = p, pp;    do {      var step = steps[type];      do {        p += step;      } while (!points[p]);      pp = points[p];      if (pp !== 5 && pp !== 10) {        // set new direction        type = pp;        // delete mark        points[p] = 0;      } else { // type is 5 or 10, ie, a crossing        // set new direction        type = pp & ((0x33 * type) >> 4);        // set new type for "future hit"        points[p] &= (type >> 2 | type << 2);      }      coords.push(p % width1);      coords.push((p / width1) | 0);      --count;    } while (p0 !== p);    outlines.push(coords);    --i;  }  var drawOutline = function(c) {    c.save();    // the path shall be painted in [0..1]x[0..1] space    c.scale(1 / width, -1 / height);    c.translate(0, -height);    c.beginPath();    for (var i = 0, ii = outlines.length; i < ii; i++) {      var o = outlines[i];      c.moveTo(o[0], o[1]);      for (var j = 2, jj = o.length; j < jj; j += 2) {        c.lineTo(o[j], o[j+1]);      }    }    c.fill();    c.beginPath();    c.restore();  };  return drawOutline;}var CanvasExtraState = (function CanvasExtraStateClosure() {  function CanvasExtraState(old) {    // Are soft masks and alpha values shapes or opacities?    this.alphaIsShape = false;    this.fontSize = 0;    this.fontSizeScale = 1;    this.textMatrix = IDENTITY_MATRIX;    this.textMatrixScale = 1;    this.fontMatrix = FONT_IDENTITY_MATRIX;    this.leading = 0;    // Current point (in user coordinates)    this.x = 0;    this.y = 0;    // Start of text line (in text coordinates)    this.lineX = 0;    this.lineY = 0;    // Character and word spacing    this.charSpacing = 0;    this.wordSpacing = 0;    this.textHScale = 1;    this.textRenderingMode = TextRenderingMode.FILL;    this.textRise = 0;    // Default fore and background colors    this.fillColor = '#000000';    this.strokeColor = '#000000';    this.patternFill = false;    // Note: fill alpha applies to all non-stroking operations    this.fillAlpha = 1;    this.strokeAlpha = 1;    this.lineWidth = 1;    this.activeSMask = null; // nonclonable field (see the save method below)    this.old = old;  }  CanvasExtraState.prototype = {    clone: function CanvasExtraState_clone() {      return Object.create(this);    },    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {      this.x = x;      this.y = y;    }  };  return CanvasExtraState;})();var CanvasGraphics = (function CanvasGraphicsClosure() {  // Defines the time the executeOperatorList is going to be executing  // before it stops and shedules a continue of execution.  var EXECUTION_TIME = 15;  // Defines the number of steps before checking the execution time  var EXECUTION_STEPS = 10;  function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {    this.ctx = canvasCtx;    this.current = new CanvasExtraState();    this.stateStack = [];    this.pendingClip = null;    this.pendingEOFill = false;    this.res = null;    this.xobjs = null;    this.commonObjs = commonObjs;    this.objs = objs;    this.imageLayer = imageLayer;    this.groupStack = [];    this.processingType3 = null;    // Patterns are painted relative to the initial page/form transform, see pdf    // spec 8.7.2 NOTE 1.    this.baseTransform = null;    this.baseTransformStack = [];    this.groupLevel = 0;    this.smaskStack = [];    this.smaskCounter = 0;    this.tempSMask = null;    this.cachedCanvases = new CachedCanvases();    if (canvasCtx) {      // NOTE: if mozCurrentTransform is polyfilled, then the current state of      // the transformation must already be set in canvasCtx._transformMatrix.      addContextCurrentTransform(canvasCtx);    }    this.cachedGetSinglePixelWidth = null;  }  function putBinaryImageData(ctx, imgData) {    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {      ctx.putImageData(imgData, 0, 0);      return;    }    // Put the image data to the canvas in chunks, rather than putting the    // whole image at once.  This saves JS memory, because the ImageData object    // is smaller. It also possibly saves C++ memory within the implementation    // of putImageData(). (E.g. in Firefox we make two short-lived copies of    // the data passed to putImageData()). |n| shouldn't be too small, however,    // because too many putImageData() calls will slow things down.    //    // Note: as written, if the last chunk is partial, the putImageData() call    // will (conceptually) put pixels past the bounds of the canvas.  But    // that's ok; any such pixels are ignored.    var height = imgData.height, width = imgData.width;    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);    var srcPos = 0, destPos;    var src = imgData.data;    var dest = chunkImgData.data;    var i, j, thisChunkHeight, elemsInThisChunk;    // There are multiple forms in which the pixel data can be passed, and    // imgData.kind tells us which one this is.    if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {      // Grayscale, 1 bit per pixel (i.e. black-and-white).      var srcLength = src.byteLength;      var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) :        new Uint32ArrayView(dest);      var dest32DataLength = dest32.length;      var fullSrcDiff = (width + 7) >> 3;      var white = 0xFFFFFFFF;      var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ?        0xFF000000 : 0x000000FF;      for (i = 0; i < totalChunks; i++) {        thisChunkHeight =          (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;        destPos = 0;        for (j = 0; j < thisChunkHeight; j++) {          var srcDiff = srcLength - srcPos;          var k = 0;          var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;          var kEndUnrolled = kEnd & ~7;          var mask = 0;          var srcByte = 0;          for (; k < kEndUnrolled; k += 8) {            srcByte = src[srcPos++];            dest32[destPos++] = (srcByte & 128) ? white : black;            dest32[destPos++] = (srcByte & 64) ? white : black;            dest32[destPos++] = (srcByte & 32) ? white : black;            dest32[destPos++] = (srcByte & 16) ? white : black;            dest32[destPos++] = (srcByte & 8) ? white : black;            dest32[destPos++] = (srcByte & 4) ? white : black;            dest32[destPos++] = (srcByte & 2) ? white : black;            dest32[destPos++] = (srcByte & 1) ? white : black;          }          for (; k < kEnd; k++) {             if (mask === 0) {               srcByte = src[srcPos++];               mask = 128;             }            dest32[destPos++] = (srcByte & mask) ? white : black;            mask >>= 1;          }        }        // We ran out of input. Make all remaining pixels transparent.        while (destPos < dest32DataLength) {          dest32[destPos++] = 0;        }        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);      }    } else if (imgData.kind === ImageKind.RGBA_32BPP) {      // RGBA, 32-bits per pixel.      j = 0;      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;      for (i = 0; i < fullChunks; i++) {        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));        srcPos += elemsInThisChunk;        ctx.putImageData(chunkImgData, 0, j);        j += FULL_CHUNK_HEIGHT;      }      if (i < totalChunks) {        elemsInThisChunk = width * partialChunkHeight * 4;        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));        ctx.putImageData(chunkImgData, 0, j);      }    } else if (imgData.kind === ImageKind.RGB_24BPP) {      // RGB, 24-bits per pixel.      thisChunkHeight = FULL_CHUNK_HEIGHT;      elemsInThisChunk = width * thisChunkHeight;      for (i = 0; i < totalChunks; i++) {        if (i >= fullChunks) {          thisChunkHeight = partialChunkHeight;          elemsInThisChunk = width * thisChunkHeight;        }        destPos = 0;        for (j = elemsInThisChunk; j--;) {          dest[destPos++] = src[srcPos++];          dest[destPos++] = src[srcPos++];          dest[destPos++] = src[srcPos++];          dest[destPos++] = 255;        }        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);      }    } else {      error('bad image kind: ' + imgData.kind);    }  }  function putBinaryImageMask(ctx, imgData) {    var height = imgData.height, width = imgData.width;    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);    var srcPos = 0;    var src = imgData.data;    var dest = chunkImgData.data;    for (var i = 0; i < totalChunks; i++) {      var thisChunkHeight =        (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;      // Expand the mask so it can be used by the canvas.  Any required      // inversion has already been handled.      var destPos = 3; // alpha component offset      for (var j = 0; j < thisChunkHeight; j++) {        var mask = 0;        for (var k = 0; k < width; k++) {          if (!mask) {            var elem = src[srcPos++];            mask = 128;          }          dest[destPos] = (elem & mask) ? 0 : 255;          destPos += 4;          mask >>= 1;        }      }      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);    }  }  function copyCtxState(sourceCtx, destCtx) {    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',                      'globalCompositeOperation', 'font'];    for (var i = 0, ii = properties.length; i < ii; i++) {      var property = properties[i];      if (sourceCtx[property] !== undefined) {        destCtx[property] = sourceCtx[property];      }    }    if (sourceCtx.setLineDash !== undefined) {      destCtx.setLineDash(sourceCtx.getLineDash());      destCtx.lineDashOffset =  sourceCtx.lineDashOffset;    } else if (sourceCtx.mozDashOffset !== undefined) {      destCtx.mozDash = sourceCtx.mozDash;      destCtx.mozDashOffset = sourceCtx.mozDashOffset;    }  }  function composeSMaskBackdrop(bytes, r0, g0, b0) {    var length = bytes.length;    for (var i = 3; i < length; i += 4) {      var alpha = bytes[i];      if (alpha === 0) {        bytes[i - 3] = r0;        bytes[i - 2] = g0;        bytes[i - 1] = b0;      } else if (alpha < 255) {        var alpha_ = 255 - alpha;        bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8;        bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8;        bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8;      }    }  }  function composeSMaskAlpha(maskData, layerData, transferMap) {    var length = maskData.length;    var scale = 1 / 255;    for (var i = 3; i < length; i += 4) {      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];      layerData[i] = (layerData[i] * alpha * scale) | 0;    }  }  function composeSMaskLuminosity(maskData, layerData, transferMap) {    var length = maskData.length;    for (var i = 3; i < length; i += 4) {      var y = (maskData[i - 3] * 77) +  // * 0.3 / 255 * 0x10000              (maskData[i - 2] * 152) + // * 0.59 ....              (maskData[i - 1] * 28);   // * 0.11 ....      layerData[i] = transferMap ?        (layerData[i] * transferMap[y >> 8]) >> 8 :        (layerData[i] * y) >> 16;    }  }  function genericComposeSMask(maskCtx, layerCtx, width, height,                               subtype, backdrop, transferMap) {    var hasBackdrop = !!backdrop;    var r0 = hasBackdrop ? backdrop[0] : 0;    var g0 = hasBackdrop ? backdrop[1] : 0;    var b0 = hasBackdrop ? backdrop[2] : 0;    var composeFn;    if (subtype === 'Luminosity') {      composeFn = composeSMaskLuminosity;    } else {      composeFn = composeSMaskAlpha;    }    // processing image in chunks to save memory    var PIXELS_TO_PROCESS = 1048576;    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));    for (var row = 0; row < height; row += chunkSize) {      var chunkHeight = Math.min(chunkSize, height - row);      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);      if (hasBackdrop) {        composeSMaskBackdrop(maskData.data, r0, g0, b0);      }      composeFn(maskData.data, layerData.data, transferMap);      maskCtx.putImageData(layerData, 0, row);    }  }  function composeSMask(ctx, smask, layerCtx) {    var mask = smask.canvas;    var maskCtx = smask.context;    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,                     smask.offsetX, smask.offsetY);    var backdrop = smask.backdrop || null;    if (!smask.transferMap && WebGLUtils.isEnabled) {      var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,        {subtype: smask.subtype, backdrop: backdrop});      ctx.setTransform(1, 0, 0, 1, 0, 0);      ctx.drawImage(composed, smask.offsetX, smask.offsetY);      return;    }    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,                        smask.subtype, backdrop, smask.transferMap);    ctx.drawImage(mask, 0, 0);  }  var LINE_CAP_STYLES = ['butt', 'round', 'square'];  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];  var NORMAL_CLIP = {};  var EO_CLIP = {};  CanvasGraphics.prototype = {    beginDrawing: function CanvasGraphics_beginDrawing(transform, viewport,                                                       transparency) {      // For pdfs that use blend modes we have to clear the canvas else certain      // blend modes can look wrong since we'd be blending with a white      // backdrop. The problem with a transparent backdrop though is we then      // don't get sub pixel anti aliasing on text, creating temporary      // transparent canvas when we have blend modes.      var width = this.ctx.canvas.width;      var height = this.ctx.canvas.height;      this.ctx.save();      this.ctx.fillStyle = 'rgb(255, 255, 255)';      this.ctx.fillRect(0, 0, width, height);      this.ctx.restore();      if (transparency) {        var transparentCanvas = this.cachedCanvases.getCanvas(          'transparent', width, height, true);        this.compositeCtx = this.ctx;        this.transparentCanvas = transparentCanvas.canvas;        this.ctx = transparentCanvas.context;        this.ctx.save();        // The transform can be applied before rendering, transferring it to        // the new canvas.        this.ctx.transform.apply(this.ctx,                                 this.compositeCtx.mozCurrentTransform);      }      this.ctx.save();      if (transform) {        this.ctx.transform.apply(this.ctx, transform);      }      this.ctx.transform.apply(this.ctx, viewport.transform);      this.baseTransform = this.ctx.mozCurrentTransform.slice();      if (this.imageLayer) {        this.imageLayer.beginLayout();      }    },    executeOperatorList: function CanvasGraphics_executeOperatorList(                                    operatorList,                                    executionStartIdx, continueCallback,                                    stepper) {      var argsArray = operatorList.argsArray;      var fnArray = operatorList.fnArray;      var i = executionStartIdx || 0;      var argsArrayLen = argsArray.length;      // Sometimes the OperatorList to execute is empty.      if (argsArrayLen === i) {        return i;      }      var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS &&                             typeof continueCallback === 'function');      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;      var steps = 0;      var commonObjs = this.commonObjs;      var objs = this.objs;      var fnId;      while (true) {        if (stepper !== undefined && i === stepper.nextBreakPoint) {          stepper.breakIt(i, continueCallback);          return i;        }        fnId = fnArray[i];        if (fnId !== OPS.dependency) {          this[fnId].apply(this, argsArray[i]);        } else {          var deps = argsArray[i];          for (var n = 0, nn = deps.length; n < nn; n++) {            var depObjId = deps[n];            var common = depObjId[0] === 'g' && depObjId[1] === '_';            var objsPool = common ? commonObjs : objs;            // If the promise isn't resolved yet, add the continueCallback            // to the promise and bail out.            if (!objsPool.isResolved(depObjId)) {              objsPool.get(depObjId, continueCallback);              return i;            }          }        }        i++;        // If the entire operatorList was executed, stop as were done.        if (i === argsArrayLen) {          return i;        }        // If the execution took longer then a certain amount of time and        // `continueCallback` is specified, interrupt the execution.        if (chunkOperations && ++steps > EXECUTION_STEPS) {          if (Date.now() > endTime) {            continueCallback();            return i;          }          steps = 0;        }        // If the operatorList isn't executed completely yet OR the execution        // time was short enough, do another execution round.      }    },    endDrawing: function CanvasGraphics_endDrawing() {      this.ctx.restore();      if (this.transparentCanvas) {        this.ctx = this.compositeCtx;        this.ctx.drawImage(this.transparentCanvas, 0, 0);        this.transparentCanvas = null;      }      this.cachedCanvases.clear();      WebGLUtils.clear();      if (this.imageLayer) {        this.imageLayer.endLayout();      }    },    // Graphics state    setLineWidth: function CanvasGraphics_setLineWidth(width) {      this.current.lineWidth = width;      this.ctx.lineWidth = width;    },    setLineCap: function CanvasGraphics_setLineCap(style) {      this.ctx.lineCap = LINE_CAP_STYLES[style];    },    setLineJoin: function CanvasGraphics_setLineJoin(style) {      this.ctx.lineJoin = LINE_JOIN_STYLES[style];    },    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {      this.ctx.miterLimit = limit;    },    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {      var ctx = this.ctx;      if (ctx.setLineDash !== undefined) {        ctx.setLineDash(dashArray);        ctx.lineDashOffset = dashPhase;      } else {        ctx.mozDash = dashArray;        ctx.mozDashOffset = dashPhase;      }    },    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {      // Maybe if we one day fully support color spaces this will be important      // for now we can ignore.      // TODO set rendering intent?    },    setFlatness: function CanvasGraphics_setFlatness(flatness) {      // There's no way to control this with canvas, but we can safely ignore.      // TODO set flatness?    },    setGState: function CanvasGraphics_setGState(states) {      for (var i = 0, ii = states.length; i < ii; i++) {        var state = states[i];        var key = state[0];        var value = state[1];        switch (key) {          case 'LW':            this.setLineWidth(value);            break;          case 'LC':            this.setLineCap(value);            break;          case 'LJ':            this.setLineJoin(value);            break;          case 'ML':            this.setMiterLimit(value);            break;          case 'D':            this.setDash(value[0], value[1]);            break;          case 'RI':            this.setRenderingIntent(value);            break;          case 'FL':            this.setFlatness(value);            break;          case 'Font':            this.setFont(value[0], value[1]);            break;          case 'CA':            this.current.strokeAlpha = state[1];            break;          case 'ca':            this.current.fillAlpha = state[1];            this.ctx.globalAlpha = state[1];            break;          case 'BM':            if (value && value.name && (value.name !== 'Normal')) {              var mode = value.name.replace(/([A-Z])/g,                function(c) {                  return '-' + c.toLowerCase();                }              ).substring(1);              this.ctx.globalCompositeOperation = mode;              if (this.ctx.globalCompositeOperation !== mode) {                warn('globalCompositeOperation "' + mode +                     '" is not supported');              }            } else {              this.ctx.globalCompositeOperation = 'source-over';            }            break;          case 'SMask':            if (this.current.activeSMask) {              this.endSMaskGroup();            }            this.current.activeSMask = value ? this.tempSMask : null;            if (this.current.activeSMask) {              this.beginSMaskGroup();            }            this.tempSMask = null;            break;        }      }    },    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {      var activeSMask = this.current.activeSMask;      var drawnWidth = activeSMask.canvas.width;      var drawnHeight = activeSMask.canvas.height;      var cacheId = 'smaskGroupAt' + this.groupLevel;      var scratchCanvas = this.cachedCanvases.getCanvas(        cacheId, drawnWidth, drawnHeight, true);      var currentCtx = this.ctx;      var currentTransform = currentCtx.mozCurrentTransform;      this.ctx.save();      var groupCtx = scratchCanvas.context;      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);      groupCtx.transform.apply(groupCtx, currentTransform);      copyCtxState(currentCtx, groupCtx);      this.ctx = groupCtx;      this.setGState([        ['BM', 'Normal'],        ['ca', 1],        ['CA', 1]      ]);      this.groupStack.push(currentCtx);      this.groupLevel++;    },    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {      var groupCtx = this.ctx;      this.groupLevel--;      this.ctx = this.groupStack.pop();      composeSMask(this.ctx, this.current.activeSMask, groupCtx);      this.ctx.restore();      copyCtxState(groupCtx, this.ctx);    },    save: function CanvasGraphics_save() {      this.ctx.save();      var old = this.current;      this.stateStack.push(old);      this.current = old.clone();      this.current.activeSMask = null;    },    restore: function CanvasGraphics_restore() {      if (this.stateStack.length !== 0) {        if (this.current.activeSMask !== null) {          this.endSMaskGroup();        }        this.current = this.stateStack.pop();        this.ctx.restore();        // Ensure that the clipping path is reset (fixes issue6413.pdf).        this.pendingClip = null;        this.cachedGetSinglePixelWidth = null;      }    },    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {      this.ctx.transform(a, b, c, d, e, f);      this.cachedGetSinglePixelWidth = null;    },    // Path    constructPath: function CanvasGraphics_constructPath(ops, args) {      var ctx = this.ctx;      var current = this.current;      var x = current.x, y = current.y;      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {        switch (ops[i] | 0) {          case OPS.rectangle:            x = args[j++];            y = args[j++];            var width = args[j++];            var height = args[j++];            if (width === 0) {              width = this.getSinglePixelWidth();            }            if (height === 0) {              height = this.getSinglePixelWidth();            }            var xw = x + width;            var yh = y + height;            this.ctx.moveTo(x, y);            this.ctx.lineTo(xw, y);            this.ctx.lineTo(xw, yh);            this.ctx.lineTo(x, yh);            this.ctx.lineTo(x, y);            this.ctx.closePath();            break;          case OPS.moveTo:            x = args[j++];            y = args[j++];            ctx.moveTo(x, y);            break;          case OPS.lineTo:            x = args[j++];            y = args[j++];            ctx.lineTo(x, y);            break;          case OPS.curveTo:            x = args[j + 4];            y = args[j + 5];            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3],                              x, y);            j += 6;            break;          case OPS.curveTo2:            ctx.bezierCurveTo(x, y, args[j], args[j + 1],                              args[j + 2], args[j + 3]);            x = args[j + 2];            y = args[j + 3];            j += 4;            break;          case OPS.curveTo3:            x = args[j + 2];            y = args[j + 3];            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);            j += 4;            break;          case OPS.closePath:            ctx.closePath();            break;        }      }      current.setCurrentPoint(x, y);    },    closePath: function CanvasGraphics_closePath() {      this.ctx.closePath();    },    stroke: function CanvasGraphics_stroke(consumePath) {      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;      var ctx = this.ctx;      var strokeColor = this.current.strokeColor;      // Prevent drawing too thin lines by enforcing a minimum line width.      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR,                               this.current.lineWidth);      // For stroke we want to temporarily change the global alpha to the      // stroking alpha.      ctx.globalAlpha = this.current.strokeAlpha;      if (strokeColor && strokeColor.hasOwnProperty('type') &&          strokeColor.type === 'Pattern') {        // for patterns, we transform to pattern space, calculate        // the pattern, call stroke, and restore to user space        ctx.save();        ctx.strokeStyle = strokeColor.getPattern(ctx, this);        ctx.stroke();        ctx.restore();      } else {        ctx.stroke();      }      if (consumePath) {        this.consumePath();      }      // Restore the global alpha to the fill alpha      ctx.globalAlpha = this.current.fillAlpha;    },    closeStroke: function CanvasGraphics_closeStroke() {      this.closePath();      this.stroke();    },    fill: function CanvasGraphics_fill(consumePath) {      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;      var ctx = this.ctx;      var fillColor = this.current.fillColor;      var isPatternFill = this.current.patternFill;      var needRestore = false;      if (isPatternFill) {        ctx.save();        if (this.baseTransform) {          ctx.setTransform.apply(ctx, this.baseTransform);        }        ctx.fillStyle = fillColor.getPattern(ctx, this);        needRestore = true;      }      if (this.pendingEOFill) {        if (ctx.mozFillRule !== undefined) {          ctx.mozFillRule = 'evenodd';          ctx.fill();          ctx.mozFillRule = 'nonzero';        } else {          ctx.fill('evenodd');        }        this.pendingEOFill = false;      } else {        ctx.fill();      }      if (needRestore) {        ctx.restore();      }      if (consumePath) {        this.consumePath();      }    },    eoFill: function CanvasGraphics_eoFill() {      this.pendingEOFill = true;      this.fill();    },    fillStroke: function CanvasGraphics_fillStroke() {      this.fill(false);      this.stroke(false);      this.consumePath();    },    eoFillStroke: function CanvasGraphics_eoFillStroke() {      this.pendingEOFill = true;      this.fillStroke();    },    closeFillStroke: function CanvasGraphics_closeFillStroke() {      this.closePath();      this.fillStroke();    },    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {      this.pendingEOFill = true;      this.closePath();      this.fillStroke();    },    endPath: function CanvasGraphics_endPath() {      this.consumePath();    },    // Clipping    clip: function CanvasGraphics_clip() {      this.pendingClip = NORMAL_CLIP;    },    eoClip: function CanvasGraphics_eoClip() {      this.pendingClip = EO_CLIP;    },    // Text    beginText: function CanvasGraphics_beginText() {      this.current.textMatrix = IDENTITY_MATRIX;      this.current.textMatrixScale = 1;      this.current.x = this.current.lineX = 0;      this.current.y = this.current.lineY = 0;    },    endText: function CanvasGraphics_endText() {      var paths = this.pendingTextPaths;      var ctx = this.ctx;      if (paths === undefined) {        ctx.beginPath();        return;      }      ctx.save();      ctx.beginPath();      for (var i = 0; i < paths.length; i++) {        var path = paths[i];        ctx.setTransform.apply(ctx, path.transform);        ctx.translate(path.x, path.y);        path.addToPath(ctx, path.fontSize);      }      ctx.restore();      ctx.clip();      ctx.beginPath();      delete this.pendingTextPaths;    },    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {      this.current.charSpacing = spacing;    },    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {      this.current.wordSpacing = spacing;    },    setHScale: function CanvasGraphics_setHScale(scale) {      this.current.textHScale = scale / 100;    },    setLeading: function CanvasGraphics_setLeading(leading) {      this.current.leading = -leading;    },    setFont: function CanvasGraphics_setFont(fontRefName, size) {      var fontObj = this.commonObjs.get(fontRefName);      var current = this.current;      if (!fontObj) {        error('Can\'t find font for ' + fontRefName);      }      current.fontMatrix = (fontObj.fontMatrix ?                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);      // A valid matrix needs all main diagonal elements to be non-zero      // This also ensures we bypass FF bugzilla bug #719844.      if (current.fontMatrix[0] === 0 ||          current.fontMatrix[3] === 0) {        warn('Invalid font matrix for font ' + fontRefName);      }      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',      // and in some docs this can be negative (inverted x-y axes).      if (size < 0) {        size = -size;        current.fontDirection = -1;      } else {        current.fontDirection = 1;      }      this.current.font = fontObj;      this.current.fontSize = size;      if (fontObj.isType3Font) {        return; // we don't need ctx.font for Type3 fonts      }      var name = fontObj.loadedName || 'sans-serif';      var bold = fontObj.black ? (fontObj.bold ? '900' : 'bold') :                                 (fontObj.bold ? 'bold' : 'normal');      var italic = fontObj.italic ? 'italic' : 'normal';      var typeface = '"' + name + '", ' + fontObj.fallbackName;      // Some font backends cannot handle fonts below certain size.      // Keeping the font at minimal size and using the fontSizeScale to change      // the current transformation matrix before the fillText/strokeText.      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE :                            size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;      this.current.fontSizeScale = size / browserFontSize;      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;      this.ctx.font = rule;    },    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {      this.current.textRenderingMode = mode;    },    setTextRise: function CanvasGraphics_setTextRise(rise) {      this.current.textRise = rise;    },    moveText: function CanvasGraphics_moveText(x, y) {      this.current.x = this.current.lineX += x;      this.current.y = this.current.lineY += y;    },    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {      this.setLeading(-y);      this.moveText(x, y);    },    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {      this.current.textMatrix = [a, b, c, d, e, f];      this.current.textMatrixScale = Math.sqrt(a * a + b * b);      this.current.x = this.current.lineX = 0;      this.current.y = this.current.lineY = 0;    },    nextLine: function CanvasGraphics_nextLine() {      this.moveText(0, this.current.leading);    },    paintChar: function CanvasGraphics_paintChar(character, x, y) {      var ctx = this.ctx;      var current = this.current;      var font = current.font;      var textRenderingMode = current.textRenderingMode;      var fontSize = current.fontSize / current.fontSizeScale;      var fillStrokeMode = textRenderingMode &        TextRenderingMode.FILL_STROKE_MASK;      var isAddToPathSet = !!(textRenderingMode &        TextRenderingMode.ADD_TO_PATH_FLAG);      var addToPath;      if (font.disableFontFace || isAddToPathSet) {        addToPath = font.getPathGenerator(this.commonObjs, character);      }      if (font.disableFontFace) {        ctx.save();        ctx.translate(x, y);        ctx.beginPath();        addToPath(ctx, fontSize);        if (fillStrokeMode === TextRenderingMode.FILL ||            fillStrokeMode === TextRenderingMode.FILL_STROKE) {          ctx.fill();        }        if (fillStrokeMode === TextRenderingMode.STROKE ||            fillStrokeMode === TextRenderingMode.FILL_STROKE) {          ctx.stroke();        }        ctx.restore();      } else {        if (fillStrokeMode === TextRenderingMode.FILL ||            fillStrokeMode === TextRenderingMode.FILL_STROKE) {          ctx.fillText(character, x, y);        }        if (fillStrokeMode === TextRenderingMode.STROKE ||            fillStrokeMode === TextRenderingMode.FILL_STROKE) {          ctx.strokeText(character, x, y);        }      }      if (isAddToPathSet) {        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);        paths.push({          transform: ctx.mozCurrentTransform,          x: x,          y: y,          fontSize: fontSize,          addToPath: addToPath        });      }    },    get isFontSubpixelAAEnabled() {      // Checks if anti-aliasing is enabled when scaled text is painted.      // On Windows GDI scaled fonts looks bad.      var ctx = document.createElement('canvas').getContext('2d');      ctx.scale(1.5, 1);      ctx.fillText('I', 0, 10);      var data = ctx.getImageData(0, 0, 10, 10).data;      var enabled = false;      for (var i = 3; i < data.length; i += 4) {        if (data[i] > 0 && data[i] < 255) {          enabled = true;          break;        }      }      return shadow(this, 'isFontSubpixelAAEnabled', enabled);    },    showText: function CanvasGraphics_showText(glyphs) {      var current = this.current;      var font = current.font;      if (font.isType3Font) {        return this.showType3Text(glyphs);      }      var fontSize = current.fontSize;      if (fontSize === 0) {        return;      }      var ctx = this.ctx;      var fontSizeScale = current.fontSizeScale;      var charSpacing = current.charSpacing;      var wordSpacing = current.wordSpacing;      var fontDirection = current.fontDirection;      var textHScale = current.textHScale * fontDirection;      var glyphsLength = glyphs.length;      var vertical = font.vertical;      var spacingDir = vertical ? 1 : -1;      var defaultVMetrics = font.defaultVMetrics;      var widthAdvanceScale = fontSize * current.fontMatrix[0];      var simpleFillText =        current.textRenderingMode === TextRenderingMode.FILL &&        !font.disableFontFace;      ctx.save();      ctx.transform.apply(ctx, current.textMatrix);      ctx.translate(current.x, current.y + current.textRise);      if (current.patternFill) {        // TODO: Some shading patterns are not applied correctly to text,        //       e.g. issues 3988 and 5432, and ShowText-ShadingPattern.pdf.        ctx.fillStyle = current.fillColor.getPattern(ctx, this);      }      if (fontDirection > 0) {        ctx.scale(textHScale, -1);      } else {        ctx.scale(textHScale, 1);      }      var lineWidth = current.lineWidth;      var scale = current.textMatrixScale;      if (scale === 0 || lineWidth === 0) {        var fillStrokeMode = current.textRenderingMode &          TextRenderingMode.FILL_STROKE_MASK;        if (fillStrokeMode === TextRenderingMode.STROKE ||            fillStrokeMode === TextRenderingMode.FILL_STROKE) {          this.cachedGetSinglePixelWidth = null;          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;        }      } else {        lineWidth /= scale;      }      if (fontSizeScale !== 1.0) {        ctx.scale(fontSizeScale, fontSizeScale);        lineWidth /= fontSizeScale;      }      ctx.lineWidth = lineWidth;      var x = 0, i;      for (i = 0; i < glyphsLength; ++i) {        var glyph = glyphs[i];        if (isNum(glyph)) {          x += spacingDir * glyph * fontSize / 1000;          continue;        }        var restoreNeeded = false;        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;        var character = glyph.fontChar;        var accent = glyph.accent;        var scaledX, scaledY, scaledAccentX, scaledAccentY;        var width = glyph.width;        if (vertical) {          var vmetric, vx, vy;          vmetric = glyph.vmetric || defaultVMetrics;          vx = glyph.vmetric ? vmetric[1] : width * 0.5;          vx = -vx * widthAdvanceScale;          vy = vmetric[2] * widthAdvanceScale;          width = vmetric ? -vmetric[0] : width;          scaledX = vx / fontSizeScale;          scaledY = (x + vy) / fontSizeScale;        } else {          scaledX = x / fontSizeScale;          scaledY = 0;        }        if (font.remeasure && width > 0) {          // Some standard fonts may not have the exact width: rescale per          // character if measured width is greater than expected glyph width          // and subpixel-aa is enabled, otherwise just center the glyph.          var measuredWidth = ctx.measureText(character).width * 1000 /            fontSize * fontSizeScale;          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {            var characterScaleX = width / measuredWidth;            restoreNeeded = true;            ctx.save();            ctx.scale(characterScaleX, 1);            scaledX /= characterScaleX;          } else if (width !== measuredWidth) {            scaledX += (width - measuredWidth) / 2000 *              fontSize / fontSizeScale;          }        }        if (simpleFillText && !accent) {          // common case          ctx.fillText(character, scaledX, scaledY);        } else {          this.paintChar(character, scaledX, scaledY);          if (accent) {            scaledAccentX = scaledX + accent.offset.x / fontSizeScale;            scaledAccentY = scaledY - accent.offset.y / fontSizeScale;            this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);          }        }        var charWidth = width * widthAdvanceScale + spacing * fontDirection;        x += charWidth;        if (restoreNeeded) {          ctx.restore();        }      }      if (vertical) {        current.y -= x * textHScale;      } else {        current.x += x * textHScale;      }      ctx.restore();    },    showType3Text: function CanvasGraphics_showType3Text(glyphs) {      // Type3 fonts - each glyph is a "mini-PDF"      var ctx = this.ctx;      var current = this.current;      var font = current.font;      var fontSize = current.fontSize;      var fontDirection = current.fontDirection;      var spacingDir = font.vertical ? 1 : -1;      var charSpacing = current.charSpacing;      var wordSpacing = current.wordSpacing;      var textHScale = current.textHScale * fontDirection;      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;      var glyphsLength = glyphs.length;      var isTextInvisible =        current.textRenderingMode === TextRenderingMode.INVISIBLE;      var i, glyph, width, spacingLength;      if (isTextInvisible || fontSize === 0) {        return;      }      this.cachedGetSinglePixelWidth = null;      ctx.save();      ctx.transform.apply(ctx, current.textMatrix);      ctx.translate(current.x, current.y);      ctx.scale(textHScale, fontDirection);      for (i = 0; i < glyphsLength; ++i) {        glyph = glyphs[i];        if (isNum(glyph)) {          spacingLength = spacingDir * glyph * fontSize / 1000;          this.ctx.translate(spacingLength, 0);          current.x += spacingLength * textHScale;          continue;        }        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;        var operatorList = font.charProcOperatorList[glyph.operatorListId];        if (!operatorList) {          warn('Type3 character \"' + glyph.operatorListId +               '\" is not available');          continue;        }        this.processingType3 = glyph;        this.save();        ctx.scale(fontSize, fontSize);        ctx.transform.apply(ctx, fontMatrix);        this.executeOperatorList(operatorList);        this.restore();        var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);        width = transformed[0] * fontSize + spacing;        ctx.translate(width, 0);        current.x += width * textHScale;      }      ctx.restore();      this.processingType3 = null;    },    // Type3 fonts    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {      // We can safely ignore this since the width should be the same      // as the width in the Widths array.    },    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,                                                                        yWidth,                                                                        llx,                                                                        lly,                                                                        urx,                                                                        ury) {      // TODO According to the spec we're also suppose to ignore any operators      // that set color or include images while processing this type3 font.      this.ctx.rect(llx, lly, urx - llx, ury - lly);      this.clip();      this.endPath();    },    // Color    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {      var pattern;      if (IR[0] === 'TilingPattern') {        var color = IR[1];        var baseTransform = this.baseTransform ||                            this.ctx.mozCurrentTransform.slice();        var self = this;        var canvasGraphicsFactory = {          createCanvasGraphics: function (ctx) {            return new CanvasGraphics(ctx, self.commonObjs, self.objs);          }        };        pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory,                                    baseTransform);      } else {        pattern = getShadingPatternFromIR(IR);      }      return pattern;    },    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {      this.current.strokeColor = this.getColorN_Pattern(arguments);    },    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {      this.current.fillColor = this.getColorN_Pattern(arguments);      this.current.patternFill = true;    },    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {      var color = Util.makeCssRgb(r, g, b);      this.ctx.strokeStyle = color;      this.current.strokeColor = color;    },    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {      var color = Util.makeCssRgb(r, g, b);      this.ctx.fillStyle = color;      this.current.fillColor = color;      this.current.patternFill = false;    },    shadingFill: function CanvasGraphics_shadingFill(patternIR) {      var ctx = this.ctx;      this.save();      var pattern = getShadingPatternFromIR(patternIR);      ctx.fillStyle = pattern.getPattern(ctx, this, true);      var inv = ctx.mozCurrentTransformInverse;      if (inv) {        var canvas = ctx.canvas;        var width = canvas.width;        var height = canvas.height;        var bl = Util.applyTransform([0, 0], inv);        var br = Util.applyTransform([0, height], inv);        var ul = Util.applyTransform([width, 0], inv);        var ur = Util.applyTransform([width, height], inv);        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);      } else {        // HACK to draw the gradient onto an infinite rectangle.        // PDF gradients are drawn across the entire image while        // Canvas only allows gradients to be drawn in a rectangle        // The following bug should allow us to remove this.        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);      }      this.restore();    },    // Images    beginInlineImage: function CanvasGraphics_beginInlineImage() {      error('Should not call beginInlineImage');    },    beginImageData: function CanvasGraphics_beginImageData() {      error('Should not call beginImageData');    },    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,                                                                        bbox) {      this.save();      this.baseTransformStack.push(this.baseTransform);      if (isArray(matrix) && 6 === matrix.length) {        this.transform.apply(this, matrix);      }      this.baseTransform = this.ctx.mozCurrentTransform;      if (isArray(bbox) && 4 === bbox.length) {        var width = bbox[2] - bbox[0];        var height = bbox[3] - bbox[1];        this.ctx.rect(bbox[0], bbox[1], width, height);        this.clip();        this.endPath();      }    },    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {      this.restore();      this.baseTransform = this.baseTransformStack.pop();    },    beginGroup: function CanvasGraphics_beginGroup(group) {      this.save();      var currentCtx = this.ctx;      // TODO non-isolated groups - according to Rik at adobe non-isolated      // group results aren't usually that different and they even have tools      // that ignore this setting. Notes from Rik on implmenting:      // - When you encounter an transparency group, create a new canvas with      // the dimensions of the bbox      // - copy the content from the previous canvas to the new canvas      // - draw as usual      // - remove the backdrop alpha:      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha      // value of your transparency group and 'alphaBackdrop' the alpha of the      // backdrop      // - remove background color:      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)      if (!group.isolated) {        info('TODO: Support non-isolated groups.');      }      // TODO knockout - supposedly possible with the clever use of compositing      // modes.      if (group.knockout) {        warn('Knockout groups not supported.');      }      var currentTransform = currentCtx.mozCurrentTransform;      if (group.matrix) {        currentCtx.transform.apply(currentCtx, group.matrix);      }      assert(group.bbox, 'Bounding box is required.');      // Based on the current transform figure out how big the bounding box      // will actually be.      var bounds = Util.getAxialAlignedBoundingBox(                    group.bbox,                    currentCtx.mozCurrentTransform);      // Clip the bounding box to the current canvas.      var canvasBounds = [0,                          0,                          currentCtx.canvas.width,                          currentCtx.canvas.height];      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];      // Use ceil in case we're between sizes so we don't create canvas that is      // too small and make the canvas at least 1x1 pixels.      var offsetX = Math.floor(bounds[0]);      var offsetY = Math.floor(bounds[1]);      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);      var scaleX = 1, scaleY = 1;      if (drawnWidth > MAX_GROUP_SIZE) {        scaleX = drawnWidth / MAX_GROUP_SIZE;        drawnWidth = MAX_GROUP_SIZE;      }      if (drawnHeight > MAX_GROUP_SIZE) {        scaleY = drawnHeight / MAX_GROUP_SIZE;        drawnHeight = MAX_GROUP_SIZE;      }      var cacheId = 'groupAt' + this.groupLevel;      if (group.smask) {        // Using two cache entries is case if masks are used one after another.        cacheId +=  '_smask_' + ((this.smaskCounter++) % 2);      }      var scratchCanvas = this.cachedCanvases.getCanvas(        cacheId, drawnWidth, drawnHeight, true);      var groupCtx = scratchCanvas.context;      // Since we created a new canvas that is just the size of the bounding box      // we have to translate the group ctx.      groupCtx.scale(1 / scaleX, 1 / scaleY);      groupCtx.translate(-offsetX, -offsetY);      groupCtx.transform.apply(groupCtx, currentTransform);      if (group.smask) {        // Saving state and cached mask to be used in setGState.        this.smaskStack.push({          canvas: scratchCanvas.canvas,          context: groupCtx,          offsetX: offsetX,          offsetY: offsetY,          scaleX: scaleX,          scaleY: scaleY,          subtype: group.smask.subtype,          backdrop: group.smask.backdrop,          transferMap: group.smask.transferMap || null        });      } else {        // Setup the current ctx so when the group is popped we draw it at the        // right location.        currentCtx.setTransform(1, 0, 0, 1, 0, 0);        currentCtx.translate(offsetX, offsetY);        currentCtx.scale(scaleX, scaleY);      }      // The transparency group inherits all off the current graphics state      // except the blend mode, soft mask, and alpha constants.      copyCtxState(currentCtx, groupCtx);      this.ctx = groupCtx;      this.setGState([        ['BM', 'Normal'],        ['ca', 1],        ['CA', 1]      ]);      this.groupStack.push(currentCtx);      this.groupLevel++;    },    endGroup: function CanvasGraphics_endGroup(group) {      this.groupLevel--;      var groupCtx = this.ctx;      this.ctx = this.groupStack.pop();      // Turn off image smoothing to avoid sub pixel interpolation which can      // look kind of blurry for some pdfs.      if (this.ctx.imageSmoothingEnabled !== undefined) {        this.ctx.imageSmoothingEnabled = false;      } else {        this.ctx.mozImageSmoothingEnabled = false;      }      if (group.smask) {        this.tempSMask = this.smaskStack.pop();      } else {        this.ctx.drawImage(groupCtx.canvas, 0, 0);      }      this.restore();    },    beginAnnotations: function CanvasGraphics_beginAnnotations() {      this.save();      this.current = new CanvasExtraState();      if (this.baseTransform) {        this.ctx.setTransform.apply(this.ctx, this.baseTransform);      }    },    endAnnotations: function CanvasGraphics_endAnnotations() {      this.restore();    },    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,                                                             matrix) {      this.save();      if (isArray(rect) && 4 === rect.length) {        var width = rect[2] - rect[0];        var height = rect[3] - rect[1];        this.ctx.rect(rect[0], rect[1], width, height);        this.clip();        this.endPath();      }      this.transform.apply(this, transform);      this.transform.apply(this, matrix);    },    endAnnotation: function CanvasGraphics_endAnnotation() {      this.restore();    },    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {      var domImage = this.objs.get(objId);      if (!domImage) {        warn('Dependent image isn\'t ready yet');        return;      }      this.save();      var ctx = this.ctx;      // scale the image to the unit square      ctx.scale(1 / w, -1 / h);      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,                    0, -h, w, h);      if (this.imageLayer) {        var currentTransform = ctx.mozCurrentTransformInverse;        var position = this.getCanvasPosition(0, 0);        this.imageLayer.appendImage({          objId: objId,          left: position[0],          top: position[1],          width: w / currentTransform[0],          height: h / currentTransform[3]        });      }      this.restore();    },    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {      var ctx = this.ctx;      var width = img.width, height = img.height;      var fillColor = this.current.fillColor;      var isPatternFill = this.current.patternFill;      var glyph = this.processingType3;      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {          glyph.compiled =            compileType3Glyph({data: img.data, width: width, height: height});        } else {          glyph.compiled = null;        }      }      if (glyph && glyph.compiled) {        glyph.compiled(ctx);        return;      }      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',                                                     width, height);      var maskCtx = maskCanvas.context;      maskCtx.save();      putBinaryImageMask(maskCtx, img);      maskCtx.globalCompositeOperation = 'source-in';      maskCtx.fillStyle = isPatternFill ?                          fillColor.getPattern(maskCtx, this) : fillColor;      maskCtx.fillRect(0, 0, width, height);      maskCtx.restore();      this.paintInlineImageXObject(maskCanvas.canvas);    },    paintImageMaskXObjectRepeat:      function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,                                                          scaleY, positions) {      var width = imgData.width;      var height = imgData.height;      var fillColor = this.current.fillColor;      var isPatternFill = this.current.patternFill;      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',                                                     width, height);      var maskCtx = maskCanvas.context;      maskCtx.save();      putBinaryImageMask(maskCtx, imgData);      maskCtx.globalCompositeOperation = 'source-in';      maskCtx.fillStyle = isPatternFill ?                          fillColor.getPattern(maskCtx, this) : fillColor;      maskCtx.fillRect(0, 0, width, height);      maskCtx.restore();      var ctx = this.ctx;      for (var i = 0, ii = positions.length; i < ii; i += 2) {        ctx.save();        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);        ctx.scale(1, -1);        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,          0, -1, 1, 1);        ctx.restore();      }    },    paintImageMaskXObjectGroup:      function CanvasGraphics_paintImageMaskXObjectGroup(images) {      var ctx = this.ctx;      var fillColor = this.current.fillColor;      var isPatternFill = this.current.patternFill;      for (var i = 0, ii = images.length; i < ii; i++) {        var image = images[i];        var width = image.width, height = image.height;        var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',                                                       width, height);        var maskCtx = maskCanvas.context;        maskCtx.save();        putBinaryImageMask(maskCtx, image);        maskCtx.globalCompositeOperation = 'source-in';        maskCtx.fillStyle = isPatternFill ?                            fillColor.getPattern(maskCtx, this) : fillColor;        maskCtx.fillRect(0, 0, width, height);        maskCtx.restore();        ctx.save();        ctx.transform.apply(ctx, image.transform);        ctx.scale(1, -1);        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,                      0, -1, 1, 1);        ctx.restore();      }    },    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {      var imgData = this.objs.get(objId);      if (!imgData) {        warn('Dependent image isn\'t ready yet');        return;      }      this.paintInlineImageXObject(imgData);    },    paintImageXObjectRepeat:      function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,                                                          positions) {      var imgData = this.objs.get(objId);      if (!imgData) {        warn('Dependent image isn\'t ready yet');        return;      }      var width = imgData.width;      var height = imgData.height;      var map = [];      for (var i = 0, ii = positions.length; i < ii; i += 2) {        map.push({transform: [scaleX, 0, 0, scaleY, positions[i],                 positions[i + 1]], x: 0, y: 0, w: width, h: height});      }      this.paintInlineImageXObjectGroup(imgData, map);    },    paintInlineImageXObject:      function CanvasGraphics_paintInlineImageXObject(imgData) {      var width = imgData.width;      var height = imgData.height;      var ctx = this.ctx;      this.save();      // scale the image to the unit square      ctx.scale(1 / width, -1 / height);      var currentTransform = ctx.mozCurrentTransformInverse;      var a = currentTransform[0], b = currentTransform[1];      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);      var c = currentTransform[2], d = currentTransform[3];      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);      var imgToPaint, tmpCanvas;      // instanceof HTMLElement does not work in jsdom node.js module      if (imgData instanceof HTMLElement || !imgData.data) {        imgToPaint = imgData;      } else {        tmpCanvas = this.cachedCanvases.getCanvas('inlineImage',                                                  width, height);        var tmpCtx = tmpCanvas.context;        putBinaryImageData(tmpCtx, imgData);        imgToPaint = tmpCanvas.canvas;      }      var paintWidth = width, paintHeight = height;      var tmpCanvasId = 'prescale1';      // Vertial or horizontal scaling shall not be more than 2 to not loose the      // pixels during drawImage operation, painting on the temporary canvas(es)      // that are twice smaller in size      while ((widthScale > 2 && paintWidth > 1) ||             (heightScale > 2 && paintHeight > 1)) {        var newWidth = paintWidth, newHeight = paintHeight;        if (widthScale > 2 && paintWidth > 1) {          newWidth = Math.ceil(paintWidth / 2);          widthScale /= paintWidth / newWidth;        }        if (heightScale > 2 && paintHeight > 1) {          newHeight = Math.ceil(paintHeight / 2);          heightScale /= paintHeight / newHeight;        }        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId,                                                  newWidth, newHeight);        tmpCtx = tmpCanvas.context;        tmpCtx.clearRect(0, 0, newWidth, newHeight);        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,                                     0, 0, newWidth, newHeight);        imgToPaint = tmpCanvas.canvas;        paintWidth = newWidth;        paintHeight = newHeight;        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';      }      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,                                0, -height, width, height);      if (this.imageLayer) {        var position = this.getCanvasPosition(0, -height);        this.imageLayer.appendImage({          imgData: imgData,          left: position[0],          top: position[1],          width: width / currentTransform[0],          height: height / currentTransform[3]        });      }      this.restore();    },    paintInlineImageXObjectGroup:      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {      var ctx = this.ctx;      var w = imgData.width;      var h = imgData.height;      var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);      var tmpCtx = tmpCanvas.context;      putBinaryImageData(tmpCtx, imgData);      for (var i = 0, ii = map.length; i < ii; i++) {        var entry = map[i];        ctx.save();        ctx.transform.apply(ctx, entry.transform);        ctx.scale(1, -1);        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,                      0, -1, 1, 1);        if (this.imageLayer) {          var position = this.getCanvasPosition(entry.x, entry.y);          this.imageLayer.appendImage({            imgData: imgData,            left: position[0],            top: position[1],            width: w,            height: h          });        }        ctx.restore();      }    },    paintSolidColorImageMask:      function CanvasGraphics_paintSolidColorImageMask() {        this.ctx.fillRect(0, 0, 1, 1);    },    paintXObject: function CanvasGraphics_paintXObject() {      warn('Unsupported \'paintXObject\' command.');    },    // Marked content    markPoint: function CanvasGraphics_markPoint(tag) {      // TODO Marked content.    },    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {      // TODO Marked content.    },    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {      // TODO Marked content.    },    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(                                        tag, properties) {      // TODO Marked content.    },    endMarkedContent: function CanvasGraphics_endMarkedContent() {      // TODO Marked content.    },    // Compatibility    beginCompat: function CanvasGraphics_beginCompat() {      // TODO ignore undefined operators (should we do that anyway?)    },    endCompat: function CanvasGraphics_endCompat() {      // TODO stop ignoring undefined operators    },    // Helper functions    consumePath: function CanvasGraphics_consumePath() {      var ctx = this.ctx;      if (this.pendingClip) {        if (this.pendingClip === EO_CLIP) {          if (ctx.mozFillRule !== undefined) {            ctx.mozFillRule = 'evenodd';            ctx.clip();            ctx.mozFillRule = 'nonzero';          } else {            ctx.clip('evenodd');          }        } else {          ctx.clip();        }        this.pendingClip = null;      }      ctx.beginPath();    },    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {      if (this.cachedGetSinglePixelWidth === null) {        var inverse = this.ctx.mozCurrentTransformInverse;        // max of the current horizontal and vertical scale        this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(          (inverse[0] * inverse[0] + inverse[1] * inverse[1]),          (inverse[2] * inverse[2] + inverse[3] * inverse[3])));      }      return this.cachedGetSinglePixelWidth;    },    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {      var transform = this.ctx.mozCurrentTransform;      return [        transform[0] * x + transform[2] * y + transform[4],        transform[1] * x + transform[3] * y + transform[5]      ];    }  };  for (var op in OPS) {    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];  }  return CanvasGraphics;})();exports.CanvasGraphics = CanvasGraphics;exports.createScratchCanvas = createScratchCanvas;}));(function (root, factory) {  {    factory((root.pdfjsDisplayAPI = {}), root.pdfjsSharedUtil,      root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas,      root.pdfjsDisplayMetadata, root.pdfjsSharedGlobal);  }}(this, function (exports, sharedUtil, displayFontLoader, displayCanvas,                  displayMetadata, sharedGlobal, amdRequire) {var InvalidPDFException = sharedUtil.InvalidPDFException;var MessageHandler = sharedUtil.MessageHandler;var MissingPDFException = sharedUtil.MissingPDFException;var PasswordResponses = sharedUtil.PasswordResponses;var PasswordException = sharedUtil.PasswordException;var StatTimer = sharedUtil.StatTimer;var UnexpectedResponseException = sharedUtil.UnexpectedResponseException;var UnknownErrorException = sharedUtil.UnknownErrorException;var Util = sharedUtil.Util;var createPromiseCapability = sharedUtil.createPromiseCapability;var combineUrl = sharedUtil.combineUrl;var error = sharedUtil.error;var deprecated = sharedUtil.deprecated;var info = sharedUtil.info;var isArrayBuffer = sharedUtil.isArrayBuffer;var loadJpegStream = sharedUtil.loadJpegStream;var stringToBytes = sharedUtil.stringToBytes;var warn = sharedUtil.warn;var FontFaceObject = displayFontLoader.FontFaceObject;var FontLoader = displayFontLoader.FontLoader;var CanvasGraphics = displayCanvas.CanvasGraphics;var createScratchCanvas = displayCanvas.createScratchCanvas;var Metadata = displayMetadata.Metadata;var PDFJS = sharedGlobal.PDFJS;var globalScope = sharedGlobal.globalScope;var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536var useRequireEnsure = false;if (typeof module !== 'undefined' && module.require) {  // node.js - disable worker and set require.ensure.  PDFJS.disableWorker = true;  if (typeof require.ensure === 'undefined') {    require.ensure = require('node-ensure');  }  useRequireEnsure = true;}if (typeof __webpack_require__ !== 'undefined') {  // Webpack - get/bundle pdf.worker.js as additional file.  PDFJS.workerSrc = require('entry?name=[hash]-worker.js!./pdf.worker.js');  useRequireEnsure = true;}if (typeof requirejs !== 'undefined' && requirejs.toUrl) {  PDFJS.workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');}var fakeWorkerFilesLoader = useRequireEnsure ? (function (callback) {  require.ensure([], function () {    require('./pdf.worker.js');    callback();  });}) : (typeof requirejs !== 'undefined') ? (function (callback) {  requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) {    callback();  });}) : null;/** * The maximum allowed image size in total pixels e.g. width * height. Images * above this value will not be drawn. Use -1 for no limit. * @var {number} */PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ?                      -1 : PDFJS.maxImageSize);/** * The url of where the predefined Adobe CMaps are located. Include trailing * slash. * @var {string} */PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl);/** * Specifies if CMaps are binary packed. * @var {boolean} */PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;/** * By default fonts are converted to OpenType fonts and loaded via font face * rules. If disabled, the font will be rendered using a built in font renderer * that constructs the glyphs with primitive path commands. * @var {boolean} */PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ?                         false : PDFJS.disableFontFace);/** * Path for image resources, mainly for annotation icons. Include trailing * slash. * @var {string} */PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ?                            '' : PDFJS.imageResourcesPath);/** * Disable the web worker and run all code on the main thread. This will happen * automatically if the browser doesn't support workers or sending typed arrays * to workers. * @var {boolean} */PDFJS.disableWorker = (PDFJS.disableWorker === undefined ?                       false : PDFJS.disableWorker);/** * Path and filename of the worker file. Required when the worker is enabled in * development mode. If unspecified in the production build, the worker will be * loaded based on the location of the pdf.js file. It is recommended that * the workerSrc is set in a custom application to prevent issues caused by * third-party frameworks and libraries. * @var {string} */PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);/** * Disable range request loading of PDF files. When enabled and if the server * supports partial content requests then the PDF will be fetched in chunks. * Enabled (false) by default. * @var {boolean} */PDFJS.disableRange = (PDFJS.disableRange === undefined ?                      false : PDFJS.disableRange);/** * Disable streaming of PDF file data. By default PDF.js attempts to load PDF * in chunks. This default behavior can be disabled. * @var {boolean} */PDFJS.disableStream = (PDFJS.disableStream === undefined ?                       false : PDFJS.disableStream);/** * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js * will automatically keep fetching more data even if it isn't needed to display * the current page. This default behavior can be disabled. * * NOTE: It is also necessary to disable streaming, see above, *       in order for disabling of pre-fetching to work correctly. * @var {boolean} */PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ?                          false : PDFJS.disableAutoFetch);/** * Enables special hooks for debugging PDF.js. * @var {boolean} */PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug);/** * Enables transfer usage in postMessage for ArrayBuffers. * @var {boolean} */PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ?                              true : PDFJS.postMessageTransfers);/** * Disables URL.createObjectURL usage. * @var {boolean} */PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ?                                false : PDFJS.disableCreateObjectURL);/** * Disables WebGL usage. * @var {boolean} */PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ?                      true : PDFJS.disableWebGL);/** * Disables fullscreen support, and by extension Presentation Mode, * in browsers which support the fullscreen API. * @var {boolean} */PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ?                           false : PDFJS.disableFullscreen);/** * Enables CSS only zooming. * @var {boolean} */PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ?                        false : PDFJS.useOnlyCssZoom);/** * Controls the logging level. * The constants from PDFJS.VERBOSITY_LEVELS should be used: * - errors * - warnings [default] * - infos * @var {number} */PDFJS.verbosity = (PDFJS.verbosity === undefined ?                   PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);/** * The maximum supported canvas size in total pixels e.g. width * height. * The default value is 4096 * 4096. Use -1 for no limit. * @var {number} */PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?                         16777216 : PDFJS.maxCanvasPixels);/** * (Deprecated) Opens external links in a new window if enabled. * The default behavior opens external links in the PDF.js window. * * NOTE: This property has been deprecated, please use *       `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. * @var {boolean} */PDFJS.openExternalLinksInNewWindow = (  PDFJS.openExternalLinksInNewWindow === undefined ?    false : PDFJS.openExternalLinksInNewWindow);/** * Specifies the |target| attribute for external links. * The constants from PDFJS.LinkTarget should be used: *  - NONE [default] *  - SELF *  - BLANK *  - PARENT *  - TOP * @var {number} */PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ?                            PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget);/** * Specifies the |rel| attribute for external links. Defaults to stripping * the referrer. * @var {string} */PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ?                         'noreferrer' : PDFJS.externalLinkRel);/**  * Determines if we can eval strings as JS. Primarily used to improve  * performance for font rendering.  * @var {boolean}  */PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ?                         true : PDFJS.isEvalSupported);/** * Document initialization / loading parameters object. * * @typedef {Object} DocumentInitParameters * @property {string}     url   - The URL of the PDF. * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays *   (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded, *   use atob() to convert it to a binary string first. * @property {Object}     httpHeaders - Basic authentication headers. * @property {boolean}    withCredentials - Indicates whether or not cross-site *   Access-Control requests should be made using credentials such as cookies *   or authorization headers. The default is false. * @property {string}     password - For decrypting password-protected PDFs. * @property {TypedArray} initialData - A typed array with the first portion or *   all of the pdf data. Used by the extension since some data is already *   loaded before the switch to range requests. * @property {number}     length - The PDF file length. It's used for progress *   reports and range requests operations. * @property {PDFDataRangeTransport} range * @property {number}     rangeChunkSize - Optional parameter to specify *   maximum number of bytes fetched per range request. The default value is *   2^16 = 65536. * @property {PDFWorker}  worker - The worker that will be used for the loading *   and parsing of the PDF data. *//** * @typedef {Object} PDFDocumentStats * @property {Array} streamTypes - Used stream types in the document (an item *   is set to true if specific stream ID was used in the document). * @property {Array} fontTypes - Used font type in the document (an item is set *   to true if specific font ID was used in the document). *//** * This is the main entry point for loading a PDF and interacting with it. * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) * is used, which means it must follow the same origin rules that any XHR does * e.g. No cross domain requests without CORS. * * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src * Can be a url to where a PDF is located, a typed array (Uint8Array) * already populated with data or parameter object. * * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used * if you want to manually serve range requests for data in the PDF. * * @param {function} passwordCallback (deprecated) It is used to request a * password if wrong or no password was provided. The callback receives two * parameters: function that needs to be called with new password and reason * (see {PasswordResponses}). * * @param {function} progressCallback (deprecated) It is used to be able to * monitor the loading progress of the PDF file (necessary to implement e.g. * a loading bar). The callback receives an {Object} with the properties: * {number} loaded and {number} total. * * @return {PDFDocumentLoadingTask} */PDFJS.getDocument = function getDocument(src,                                         pdfDataRangeTransport,                                         passwordCallback,                                         progressCallback) {  var task = new PDFDocumentLoadingTask();  // Support of the obsolete arguments (for compatibility with API v1.0)  if (arguments.length > 1) {    deprecated('getDocument is called with pdfDataRangeTransport, ' +               'passwordCallback or progressCallback argument');  }  if (pdfDataRangeTransport) {    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {      // Not a PDFDataRangeTransport instance, trying to add missing properties.      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);      pdfDataRangeTransport.length = src.length;      pdfDataRangeTransport.initialData = src.initialData;      if (!pdfDataRangeTransport.abort) {        pdfDataRangeTransport.abort = function () {};      }    }    src = Object.create(src);    src.range = pdfDataRangeTransport;  }  task.onPassword = passwordCallback || null;  task.onProgress = progressCallback || null;  var source;  if (typeof src === 'string') {    source = { url: src };  } else if (isArrayBuffer(src)) {    source = { data: src };  } else if (src instanceof PDFDataRangeTransport) {    source = { range: src };  } else {    if (typeof src !== 'object') {      error('Invalid parameter in getDocument, need either Uint8Array, ' +        'string or a parameter object');    }    if (!src.url && !src.data && !src.range) {      error('Invalid parameter object: need either .data, .range or .url');    }    source = src;  }  var params = {};  var rangeTransport = null;  var worker = null;  for (var key in source) {    if (key === 'url' && typeof window !== 'undefined') {      // The full path is required in the 'url' field.      params[key] = combineUrl(window.location.href, source[key]);      continue;    } else if (key === 'range') {      rangeTransport = source[key];      continue;    } else if (key === 'worker') {      worker = source[key];      continue;    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {      // Converting string or array-like data to Uint8Array.      var pdfBytes = source[key];      if (typeof pdfBytes === 'string') {        params[key] = stringToBytes(pdfBytes);      } else if (typeof pdfBytes === 'object' && pdfBytes !== null &&                 !isNaN(pdfBytes.length)) {        params[key] = new Uint8Array(pdfBytes);      } else if (isArrayBuffer(pdfBytes)) {        params[key] = new Uint8Array(pdfBytes);      } else {        error('Invalid PDF binary data: either typed array, string or ' +              'array-like object is expected in the data property.');      }      continue;    }    params[key] = source[key];  }  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;  if (!worker) {    // Worker was not provided -- creating and owning our own.    worker = new PDFWorker();    task._worker = worker;  }  var docId = task.docId;  worker.promise.then(function () {    if (task.destroyed) {      throw new Error('Loading aborted');    }    return _fetchDocument(worker, params, rangeTransport, docId).then(        function (workerId) {      if (task.destroyed) {        throw new Error('Loading aborted');      }      var messageHandler = new MessageHandler(docId, workerId, worker.port);      messageHandler.send('Ready', null);      var transport = new WorkerTransport(messageHandler, task, rangeTransport);      task._transport = transport;    });  }).catch(task._capability.reject);  return task;};/** * Starts fetching of specified PDF document/data. * @param {PDFWorker} worker * @param {Object} source * @param {PDFDataRangeTransport} pdfDataRangeTransport * @param {string} docId Unique document id, used as MessageHandler id. * @returns {Promise} The promise, which is resolved when worker id of *                    MessageHandler is known. * @private */function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {  if (worker.destroyed) {    return Promise.reject(new Error('Worker was destroyed'));  }  source.disableAutoFetch = PDFJS.disableAutoFetch;  source.disableStream = PDFJS.disableStream;  source.chunkedViewerLoading = !!pdfDataRangeTransport;  if (pdfDataRangeTransport) {    source.length = pdfDataRangeTransport.length;    source.initialData = pdfDataRangeTransport.initialData;  }  return worker.messageHandler.sendWithPromise('GetDocRequest', {    docId: docId,    source: source,    disableRange: PDFJS.disableRange,    maxImageSize: PDFJS.maxImageSize,    cMapUrl: PDFJS.cMapUrl,    cMapPacked: PDFJS.cMapPacked,    disableFontFace: PDFJS.disableFontFace,    disableCreateObjectURL: PDFJS.disableCreateObjectURL,    verbosity: PDFJS.verbosity  }).then(function (workerId) {    if (worker.destroyed) {      throw new Error('Worker was destroyed');    }    return workerId;  });}/** * PDF document loading operation. * @class * @alias PDFDocumentLoadingTask */var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {  var nextDocumentId = 0;  /** @constructs PDFDocumentLoadingTask */  function PDFDocumentLoadingTask() {    this._capability = createPromiseCapability();    this._transport = null;    this._worker = null;    /**     * Unique document loading task id -- used in MessageHandlers.     * @type {string}     */    this.docId = 'd' + (nextDocumentId++);    /**     * Shows if loading task is destroyed.     * @type {boolean}     */    this.destroyed = false;    /**     * Callback to request a password if wrong or no password was provided.     * The callback receives two parameters: function that needs to be called     * with new password and reason (see {PasswordResponses}).     */    this.onPassword = null;    /**     * Callback to be able to monitor the loading progress of the PDF file     * (necessary to implement e.g. a loading bar). The callback receives     * an {Object} with the properties: {number} loaded and {number} total.     */    this.onProgress = null;    /**     * Callback to when unsupported feature is used. The callback receives     * an {PDFJS.UNSUPPORTED_FEATURES} argument.     */    this.onUnsupportedFeature = null;  }  PDFDocumentLoadingTask.prototype =      /** @lends PDFDocumentLoadingTask.prototype */ {    /**     * @return {Promise}     */    get promise() {      return this._capability.promise;    },    /**     * Aborts all network requests and destroys worker.     * @return {Promise} A promise that is resolved after destruction activity     *                   is completed.     */    destroy: function () {      this.destroyed = true;      var transportDestroyed = !this._transport ? Promise.resolve() :        this._transport.destroy();      return transportDestroyed.then(function () {        this._transport = null;        if (this._worker) {          this._worker.destroy();          this._worker = null;        }      }.bind(this));    },    /**     * Registers callbacks to indicate the document loading completion.     *     * @param {function} onFulfilled The callback for the loading completion.     * @param {function} onRejected The callback for the loading failure.     * @return {Promise} A promise that is resolved after the onFulfilled or     *                   onRejected callback.     */    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {      return this.promise.then.apply(this.promise, arguments);    }  };  return PDFDocumentLoadingTask;})();/** * Abstract class to support range requests file loading. * @class * @alias PDFJS.PDFDataRangeTransport * @param {number} length * @param {Uint8Array} initialData */var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() {  function PDFDataRangeTransport(length, initialData) {    this.length = length;    this.initialData = initialData;    this._rangeListeners = [];    this._progressListeners = [];    this._progressiveReadListeners = [];    this._readyCapability = createPromiseCapability();  }  PDFDataRangeTransport.prototype =      /** @lends PDFDataRangeTransport.prototype */ {    addRangeListener:        function PDFDataRangeTransport_addRangeListener(listener) {      this._rangeListeners.push(listener);    },    addProgressListener:        function PDFDataRangeTransport_addProgressListener(listener) {      this._progressListeners.push(listener);    },    addProgressiveReadListener:        function PDFDataRangeTransport_addProgressiveReadListener(listener) {      this._progressiveReadListeners.push(listener);    },    onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {      var listeners = this._rangeListeners;      for (var i = 0, n = listeners.length; i < n; ++i) {        listeners[i](begin, chunk);      }    },    onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {      this._readyCapability.promise.then(function () {        var listeners = this._progressListeners;        for (var i = 0, n = listeners.length; i < n; ++i) {          listeners[i](loaded);        }      }.bind(this));    },    onDataProgressiveRead:        function PDFDataRangeTransport_onDataProgress(chunk) {      this._readyCapability.promise.then(function () {        var listeners = this._progressiveReadListeners;        for (var i = 0, n = listeners.length; i < n; ++i) {          listeners[i](chunk);        }      }.bind(this));    },    transportReady: function PDFDataRangeTransport_transportReady() {      this._readyCapability.resolve();    },    requestDataRange:        function PDFDataRangeTransport_requestDataRange(begin, end) {      throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');    },    abort: function PDFDataRangeTransport_abort() {    }  };  return PDFDataRangeTransport;})();PDFJS.PDFDataRangeTransport = PDFDataRangeTransport;/** * Proxy to a PDFDocument in the worker thread. Also, contains commonly used * properties that can be read synchronously. * @class * @alias PDFDocumentProxy */var PDFDocumentProxy = (function PDFDocumentProxyClosure() {  function PDFDocumentProxy(pdfInfo, transport, loadingTask) {    this.pdfInfo = pdfInfo;    this.transport = transport;    this.loadingTask = loadingTask;  }  PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {    /**     * @return {number} Total number of pages the PDF contains.     */    get numPages() {      return this.pdfInfo.numPages;    },    /**     * @return {string} A unique ID to identify a PDF. Not guaranteed to be     * unique.     */    get fingerprint() {      return this.pdfInfo.fingerprint;    },    /**     * @param {number} pageNumber The page number to get. The first page is 1.     * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}     * object.     */    getPage: function PDFDocumentProxy_getPage(pageNumber) {      return this.transport.getPage(pageNumber);    },    /**     * @param {{num: number, gen: number}} ref The page reference. Must have     *   the 'num' and 'gen' properties.     * @return {Promise} A promise that is resolved with the page index that is     * associated with the reference.     */    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {      return this.transport.getPageIndex(ref);    },    /**     * @return {Promise} A promise that is resolved with a lookup table for     * mapping named destinations to reference numbers.     *     * This can be slow for large documents: use getDestination instead     */    getDestinations: function PDFDocumentProxy_getDestinations() {      return this.transport.getDestinations();    },    /**     * @param {string} id The named destination to get.     * @return {Promise} A promise that is resolved with all information     * of the given named destination.     */    getDestination: function PDFDocumentProxy_getDestination(id) {      return this.transport.getDestination(id);    },    /**     * @return {Promise} A promise that is resolved with:     *   an Array containing the pageLabels that correspond to the pageIndexes,     *   or `null` when no pageLabels are present in the PDF file.     */    getPageLabels: function PDFDocumentProxy_getPageLabels() {      return this.transport.getPageLabels();    },    /**     * @return {Promise} A promise that is resolved with a lookup table for     * mapping named attachments to their content.     */    getAttachments: function PDFDocumentProxy_getAttachments() {      return this.transport.getAttachments();    },    /**     * @return {Promise} A promise that is resolved with an array of all the     * JavaScript strings in the name tree.     */    getJavaScript: function PDFDocumentProxy_getJavaScript() {      return this.transport.getJavaScript();    },    /**     * @return {Promise} A promise that is resolved with an {Array} that is a     * tree outline (if it has one) of the PDF. The tree is in the format of:     * [     *  {     *   title: string,     *   bold: boolean,     *   italic: boolean,     *   color: rgb array,     *   dest: dest obj,     *   url: string,     *   items: array of more items like this     *  },     *  ...     * ].     */    getOutline: function PDFDocumentProxy_getOutline() {      return this.transport.getOutline();    },    /**     * @return {Promise} A promise that is resolved with an {Object} that has     * info and metadata properties.  Info is an {Object} filled with anything     * available in the information dictionary and similarly metadata is a     * {Metadata} object with information from the metadata section of the PDF.     */    getMetadata: function PDFDocumentProxy_getMetadata() {      return this.transport.getMetadata();    },    /**     * @return {Promise} A promise that is resolved with a TypedArray that has     * the raw data from the PDF.     */    getData: function PDFDocumentProxy_getData() {      return this.transport.getData();    },    /**     * @return {Promise} A promise that is resolved when the document's data     * is loaded. It is resolved with an {Object} that contains the length     * property that indicates size of the PDF data in bytes.     */    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {      return this.transport.downloadInfoCapability.promise;    },    /**     * @return {Promise} A promise this is resolved with current stats about     * document structures (see {@link PDFDocumentStats}).     */    getStats: function PDFDocumentProxy_getStats() {      return this.transport.getStats();    },    /**     * Cleans up resources allocated by the document, e.g. created @font-face.     */    cleanup: function PDFDocumentProxy_cleanup() {      this.transport.startCleanup();    },    /**     * Destroys current document instance and terminates worker.     */    destroy: function PDFDocumentProxy_destroy() {      return this.loadingTask.destroy();    }  };  return PDFDocumentProxy;})();/** * Page getTextContent parameters. * * @typedef {Object} getTextContentParameters * @param {boolean} normalizeWhitespace - replaces all occurrences of *   whitespace with standard spaces (0x20). The default value is `false`. *//** * Page text content. * * @typedef {Object} TextContent * @property {array} items - array of {@link TextItem} * @property {Object} styles - {@link TextStyles} objects, indexed by font *                    name. *//** * Page text content part. * * @typedef {Object} TextItem * @property {string} str - text content. * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'. * @property {array} transform - transformation matrix. * @property {number} width - width in device space. * @property {number} height - height in device space. * @property {string} fontName - font name used by pdf.js for converted font. *//** * Text style. * * @typedef {Object} TextStyle * @property {number} ascent - font ascent. * @property {number} descent - font descent. * @property {boolean} vertical - text is in vertical mode. * @property {string} fontFamily - possible font family *//** * Page annotation parameters. * * @typedef {Object} GetAnnotationsParameters * @param {string} intent - Determines the annotations that will be fetched, *                 can be either 'display' (viewable annotations) or 'print' *                 (printable annotations). *                 If the parameter is omitted, all annotations are fetched. *//** * Page render parameters. * * @typedef {Object} RenderParameters * @property {Object} canvasContext - A 2D context of a DOM Canvas object. * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by *                                calling of PDFPage.getViewport method. * @property {string} intent - Rendering intent, can be 'display' or 'print' *                    (default value is 'display'). * @property {Array}  transform - (optional) Additional transform, applied *                    just before viewport transform. * @property {Object} imageLayer - (optional) An object that has beginLayout, *                    endLayout and appendImage functions. * @property {function} continueCallback - (deprecated) A function that will be *                      called each time the rendering is paused.  To continue *                      rendering call the function that is the first argument *                      to the callback. *//** * PDF page operator list. * * @typedef {Object} PDFOperatorList * @property {Array} fnArray - Array containing the operator functions. * @property {Array} argsArray - Array containing the arguments of the *                               functions. *//** * Proxy to a PDFPage in the worker thread. * @class * @alias PDFPageProxy */var PDFPageProxy = (function PDFPageProxyClosure() {  function PDFPageProxy(pageIndex, pageInfo, transport) {    this.pageIndex = pageIndex;    this.pageInfo = pageInfo;    this.transport = transport;    this.stats = new StatTimer();    this.stats.enabled = !!globalScope.PDFJS.enableStats;    this.commonObjs = transport.commonObjs;    this.objs = new PDFObjects();    this.cleanupAfterRender = false;    this.pendingCleanup = false;    this.intentStates = {};    this.destroyed = false;  }  PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {    /**     * @return {number} Page number of the page. First page is 1.     */    get pageNumber() {      return this.pageIndex + 1;    },    /**     * @return {number} The number of degrees the page is rotated clockwise.     */    get rotate() {      return this.pageInfo.rotate;    },    /**     * @return {Object} The reference that points to this page. It has 'num' and     * 'gen' properties.     */    get ref() {      return this.pageInfo.ref;    },    /**     * @return {Array} An array of the visible portion of the PDF page in the     * user space units - [x1, y1, x2, y2].     */    get view() {      return this.pageInfo.view;    },    /**     * @param {number} scale The desired scale of the viewport.     * @param {number} rotate Degrees to rotate the viewport. If omitted this     * defaults to the page rotation.     * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties     * along with transforms required for rendering.     */    getViewport: function PDFPageProxy_getViewport(scale, rotate) {      if (arguments.length < 2) {        rotate = this.rotate;      }      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);    },    /**     * @param {GetAnnotationsParameters} params - Annotation parameters.     * @return {Promise} A promise that is resolved with an {Array} of the     * annotation objects.     */    getAnnotations: function PDFPageProxy_getAnnotations(params) {      var intent = (params && params.intent) || null;      if (!this.annotationsPromise || this.annotationsIntent !== intent) {        this.annotationsPromise = this.transport.getAnnotations(this.pageIndex,                                                                intent);        this.annotationsIntent = intent;      }      return this.annotationsPromise;    },    /**     * Begins the process of rendering a page to the desired context.     * @param {RenderParameters} params Page render parameters.     * @return {RenderTask} An object that contains the promise, which     *                      is resolved when the page finishes rendering.     */    render: function PDFPageProxy_render(params) {      var stats = this.stats;      stats.time('Overall');      // If there was a pending destroy cancel it so no cleanup happens during      // this call to render.      this.pendingCleanup = false;      var renderingIntent = (params.intent === 'print' ? 'print' : 'display');      if (!this.intentStates[renderingIntent]) {        this.intentStates[renderingIntent] = {};      }      var intentState = this.intentStates[renderingIntent];      // If there's no displayReadyCapability yet, then the operatorList      // was never requested before. Make the request and create the promise.      if (!intentState.displayReadyCapability) {        intentState.receivingOperatorList = true;        intentState.displayReadyCapability = createPromiseCapability();        intentState.operatorList = {          fnArray: [],          argsArray: [],          lastChunk: false        };        this.stats.time('Page Request');        this.transport.messageHandler.send('RenderPageRequest', {          pageIndex: this.pageNumber - 1,          intent: renderingIntent        });      }      var internalRenderTask = new InternalRenderTask(complete, params,                                                      this.objs,                                                      this.commonObjs,                                                      intentState.operatorList,                                                      this.pageNumber);      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';      if (!intentState.renderTasks) {        intentState.renderTasks = [];      }      intentState.renderTasks.push(internalRenderTask);      var renderTask = internalRenderTask.task;      // Obsolete parameter support      if (params.continueCallback) {        deprecated('render is used with continueCallback parameter');        renderTask.onContinue = params.continueCallback;      }      var self = this;      intentState.displayReadyCapability.promise.then(        function pageDisplayReadyPromise(transparency) {          if (self.pendingCleanup) {            complete();            return;          }          stats.time('Rendering');          internalRenderTask.initalizeGraphics(transparency);          internalRenderTask.operatorListChanged();        },        function pageDisplayReadPromiseError(reason) {          complete(reason);        }      );      function complete(error) {        var i = intentState.renderTasks.indexOf(internalRenderTask);        if (i >= 0) {          intentState.renderTasks.splice(i, 1);        }        if (self.cleanupAfterRender) {          self.pendingCleanup = true;        }        self._tryCleanup();        if (error) {          internalRenderTask.capability.reject(error);        } else {          internalRenderTask.capability.resolve();        }        stats.timeEnd('Rendering');        stats.timeEnd('Overall');      }      return renderTask;    },    /**     * @return {Promise} A promise resolved with an {@link PDFOperatorList}     * object that represents page's operator list.     */    getOperatorList: function PDFPageProxy_getOperatorList() {      function operatorListChanged() {        if (intentState.operatorList.lastChunk) {          intentState.opListReadCapability.resolve(intentState.operatorList);        }      }      var renderingIntent = 'oplist';      if (!this.intentStates[renderingIntent]) {        this.intentStates[renderingIntent] = {};      }      var intentState = this.intentStates[renderingIntent];      if (!intentState.opListReadCapability) {        var opListTask = {};        opListTask.operatorListChanged = operatorListChanged;        intentState.receivingOperatorList = true;        intentState.opListReadCapability = createPromiseCapability();        intentState.renderTasks = [];        intentState.renderTasks.push(opListTask);        intentState.operatorList = {          fnArray: [],          argsArray: [],          lastChunk: false        };        this.transport.messageHandler.send('RenderPageRequest', {          pageIndex: this.pageIndex,          intent: renderingIntent        });      }      return intentState.opListReadCapability.promise;    },    /**     * @param {getTextContentParameters} params - getTextContent parameters.     * @return {Promise} That is resolved a {@link TextContent}     * object that represent the page text content.     */    getTextContent: function PDFPageProxy_getTextContent(params) {      var normalizeWhitespace = (params && params.normalizeWhitespace) || false;      return this.transport.messageHandler.sendWithPromise('GetTextContent', {        pageIndex: this.pageNumber - 1,        normalizeWhitespace: normalizeWhitespace,      });    },    /**     * Destroys page object.     */    _destroy: function PDFPageProxy_destroy() {      this.destroyed = true;      this.transport.pageCache[this.pageIndex] = null;      var waitOn = [];      Object.keys(this.intentStates).forEach(function(intent) {        var intentState = this.intentStates[intent];        intentState.renderTasks.forEach(function(renderTask) {          var renderCompleted = renderTask.capability.promise.            catch(function () {}); // ignoring failures          waitOn.push(renderCompleted);          renderTask.cancel();        });      }, this);      this.objs.clear();      this.annotationsPromise = null;      this.pendingCleanup = false;      return Promise.all(waitOn);    },    /**     * Cleans up resources allocated by the page. (deprecated)     */    destroy: function() {      deprecated('page destroy method, use cleanup() instead');      this.cleanup();    },    /**     * Cleans up resources allocated by the page.     */    cleanup: function PDFPageProxy_cleanup() {      this.pendingCleanup = true;      this._tryCleanup();    },    /**     * For internal use only. Attempts to clean up if rendering is in a state     * where that's possible.     * @ignore     */    _tryCleanup: function PDFPageProxy_tryCleanup() {      if (!this.pendingCleanup ||          Object.keys(this.intentStates).some(function(intent) {            var intentState = this.intentStates[intent];            return (intentState.renderTasks.length !== 0 ||                    intentState.receivingOperatorList);          }, this)) {        return;      }      Object.keys(this.intentStates).forEach(function(intent) {        delete this.intentStates[intent];      }, this);      this.objs.clear();      this.annotationsPromise = null;      this.pendingCleanup = false;    },    /**     * For internal use only.     * @ignore     */    _startRenderPage: function PDFPageProxy_startRenderPage(transparency,                                                            intent) {      var intentState = this.intentStates[intent];      // TODO Refactor RenderPageRequest to separate rendering      // and operator list logic      if (intentState.displayReadyCapability) {        intentState.displayReadyCapability.resolve(transparency);      }    },    /**     * For internal use only.     * @ignore     */    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,                                                            intent) {      var intentState = this.intentStates[intent];      var i, ii;      // Add the new chunk to the current operator list.      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);        intentState.operatorList.argsArray.push(          operatorListChunk.argsArray[i]);      }      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;      // Notify all the rendering tasks there are more operators to be consumed.      for (i = 0; i < intentState.renderTasks.length; i++) {        intentState.renderTasks[i].operatorListChanged();      }      if (operatorListChunk.lastChunk) {        intentState.receivingOperatorList = false;        this._tryCleanup();      }    }  };  return PDFPageProxy;})();/** * PDF.js web worker abstraction, it controls instantiation of PDF documents and * WorkerTransport for them.  If creation of a web worker is not possible, * a "fake" worker will be used instead. * @class */var PDFWorker = (function PDFWorkerClosure() {  var nextFakeWorkerId = 0;  function getWorkerSrc() {    if (PDFJS.workerSrc) {      return PDFJS.workerSrc;    }    if (pdfjsFilePath) {      return pdfjsFilePath.replace(/\.js$/i, '.worker.js');    }    error('No PDFJS.workerSrc specified');  }  // Loads worker code into main thread.  function setupFakeWorkerGlobal() {    if (!PDFJS.fakeWorkerFilesLoadedCapability) {      PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability();      // In the developer build load worker_loader which in turn loads all the      // other files and resolves the promise. In production only the      // pdf.worker.js file is needed.      var loader = fakeWorkerFilesLoader || function (callback) {        Util.loadScript(getWorkerSrc(), callback);      };      loader(function () {        PDFJS.fakeWorkerFilesLoadedCapability.resolve();      });    }    return PDFJS.fakeWorkerFilesLoadedCapability.promise;  }  function PDFWorker(name) {    this.name = name;    this.destroyed = false;    this._readyCapability = createPromiseCapability();    this._port = null;    this._webWorker = null;    this._messageHandler = null;    this._initialize();  }  PDFWorker.prototype =  /** @lends PDFWorker.prototype */ {    get promise() {      return this._readyCapability.promise;    },    get port() {      return this._port;    },    get messageHandler() {      return this._messageHandler;    },    _initialize: function PDFWorker_initialize() {      // If worker support isn't disabled explicit and the browser has worker      // support, create a new web worker and test if it/the browser fullfills      // all requirements to run parts of pdf.js in a web worker.      // Right now, the requirement is, that an Uint8Array is still an      // Uint8Array as it arrives on the worker. (Chrome added this with v.15.)      if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {        var workerSrc = getWorkerSrc();        try {          // Some versions of FF can't create a worker on localhost, see:          // https://bugzilla.mozilla.org/show_bug.cgi?id=683280          var worker = new Worker(workerSrc);          var messageHandler = new MessageHandler('main', 'worker', worker);          messageHandler.on('test', function PDFWorker_test(data) {            if (this.destroyed) {              this._readyCapability.reject(new Error('Worker was destroyed'));              messageHandler.destroy();              worker.terminate();              return; // worker was destroyed            }            var supportTypedArray = data && data.supportTypedArray;            if (supportTypedArray) {              this._messageHandler = messageHandler;              this._port = worker;              this._webWorker = worker;              if (!data.supportTransfers) {                PDFJS.postMessageTransfers = false;              }              this._readyCapability.resolve();            } else {              this._setupFakeWorker();              messageHandler.destroy();              worker.terminate();            }          }.bind(this));          messageHandler.on('console_log', function (data) {            console.log.apply(console, data);          });          messageHandler.on('console_error', function (data) {            console.error.apply(console, data);          });          messageHandler.on('ready', function (data) {            if (this.destroyed) {              this._readyCapability.reject(new Error('Worker was destroyed'));              messageHandler.destroy();              worker.terminate();              return; // worker was destroyed            }            try {              sendTest();            } catch (e)  {              // We need fallback to a faked worker.              this._setupFakeWorker();            }          }.bind(this));          var sendTest = function () {            var testObj = new Uint8Array(              [PDFJS.postMessageTransfers ? 255 : 0]);            // Some versions of Opera throw a DATA_CLONE_ERR on serializing the            // typed array. Also, checking if we can use transfers.            try {              messageHandler.send('test', testObj, [testObj.buffer]);            } catch (ex) {              info('Cannot use postMessage transfers');              testObj[0] = 0;              messageHandler.send('test', testObj);            }          };          // It might take time for worker to initialize (especially when AMD          // loader is used). We will try to send test immediately, and then          // when 'ready' message will arrive. The worker shall process only          // first received 'test'.          sendTest();          return;        } catch (e) {          info('The worker has been disabled.');        }      }      // Either workers are disabled, not supported or have thrown an exception.      // Thus, we fallback to a faked worker.      this._setupFakeWorker();    },    _setupFakeWorker: function PDFWorker_setupFakeWorker() {      if (!globalScope.PDFJS.disableWorker) {        warn('Setting up fake worker.');        globalScope.PDFJS.disableWorker = true;      }      setupFakeWorkerGlobal().then(function () {        if (this.destroyed) {          this._readyCapability.reject(new Error('Worker was destroyed'));          return;        }        // If we don't use a worker, just post/sendMessage to the main thread.        var port = {          _listeners: [],          postMessage: function (obj) {            var e = {data: obj};            this._listeners.forEach(function (listener) {              listener.call(this, e);            }, this);          },          addEventListener: function (name, listener) {            this._listeners.push(listener);          },          removeEventListener: function (name, listener) {            var i = this._listeners.indexOf(listener);            this._listeners.splice(i, 1);          },          terminate: function () {}        };        this._port = port;        // All fake workers use the same port, making id unique.        var id = 'fake' + (nextFakeWorkerId++);        // If the main thread is our worker, setup the handling for the        // messages -- the main thread sends to it self.        var workerHandler = new MessageHandler(id + '_worker', id, port);        PDFJS.WorkerMessageHandler.setup(workerHandler, port);        var messageHandler = new MessageHandler(id, id + '_worker', port);        this._messageHandler = messageHandler;        this._readyCapability.resolve();      }.bind(this));    },    /**     * Destroys the worker instance.     */    destroy: function PDFWorker_destroy() {      this.destroyed = true;      if (this._webWorker) {        // We need to terminate only web worker created resource.        this._webWorker.terminate();        this._webWorker = null;      }      this._port = null;      if (this._messageHandler) {        this._messageHandler.destroy();        this._messageHandler = null;      }    }  };  return PDFWorker;})();PDFJS.PDFWorker = PDFWorker;/** * For internal use only. * @ignore */var WorkerTransport = (function WorkerTransportClosure() {  function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) {    this.messageHandler = messageHandler;    this.loadingTask = loadingTask;    this.pdfDataRangeTransport = pdfDataRangeTransport;    this.commonObjs = new PDFObjects();    this.fontLoader = new FontLoader(loadingTask.docId);    this.destroyed = false;    this.destroyCapability = null;    this.pageCache = [];    this.pagePromises = [];    this.downloadInfoCapability = createPromiseCapability();    this.setupMessageHandler();  }  WorkerTransport.prototype = {    destroy: function WorkerTransport_destroy() {      if (this.destroyCapability) {        return this.destroyCapability.promise;      }      this.destroyed = true;      this.destroyCapability = createPromiseCapability();      var waitOn = [];      // We need to wait for all renderings to be completed, e.g.      // timeout/rAF can take a long time.      this.pageCache.forEach(function (page) {        if (page) {          waitOn.push(page._destroy());        }      });      this.pageCache = [];      this.pagePromises = [];      var self = this;      // We also need to wait for the worker to finish its long running tasks.      var terminated = this.messageHandler.sendWithPromise('Terminate', null);      waitOn.push(terminated);      Promise.all(waitOn).then(function () {        self.fontLoader.clear();        if (self.pdfDataRangeTransport) {          self.pdfDataRangeTransport.abort();          self.pdfDataRangeTransport = null;        }        if (self.messageHandler) {          self.messageHandler.destroy();          self.messageHandler = null;        }        self.destroyCapability.resolve();      }, this.destroyCapability.reject);      return this.destroyCapability.promise;    },    setupMessageHandler:      function WorkerTransport_setupMessageHandler() {      var messageHandler = this.messageHandler;      function updatePassword(password) {        messageHandler.send('UpdatePassword', password);      }      var pdfDataRangeTransport = this.pdfDataRangeTransport;      if (pdfDataRangeTransport) {        pdfDataRangeTransport.addRangeListener(function(begin, chunk) {          messageHandler.send('OnDataRange', {            begin: begin,            chunk: chunk          });        });        pdfDataRangeTransport.addProgressListener(function(loaded) {          messageHandler.send('OnDataProgress', {            loaded: loaded          });        });        pdfDataRangeTransport.addProgressiveReadListener(function(chunk) {          messageHandler.send('OnDataRange', {            chunk: chunk          });        });        messageHandler.on('RequestDataRange',          function transportDataRange(data) {            pdfDataRangeTransport.requestDataRange(data.begin, data.end);          }, this);      }      messageHandler.on('GetDoc', function transportDoc(data) {        var pdfInfo = data.pdfInfo;        this.numPages = data.pdfInfo.numPages;        var loadingTask = this.loadingTask;        var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);        this.pdfDocument = pdfDocument;        loadingTask._capability.resolve(pdfDocument);      }, this);      messageHandler.on('NeedPassword',                        function transportNeedPassword(exception) {        var loadingTask = this.loadingTask;        if (loadingTask.onPassword) {          return loadingTask.onPassword(updatePassword,                                        PasswordResponses.NEED_PASSWORD);        }        loadingTask._capability.reject(          new PasswordException(exception.message, exception.code));      }, this);      messageHandler.on('IncorrectPassword',                        function transportIncorrectPassword(exception) {        var loadingTask = this.loadingTask;        if (loadingTask.onPassword) {          return loadingTask.onPassword(updatePassword,                                        PasswordResponses.INCORRECT_PASSWORD);        }        loadingTask._capability.reject(          new PasswordException(exception.message, exception.code));      }, this);      messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {        this.loadingTask._capability.reject(          new InvalidPDFException(exception.message));      }, this);      messageHandler.on('MissingPDF', function transportMissingPDF(exception) {        this.loadingTask._capability.reject(          new MissingPDFException(exception.message));      }, this);      messageHandler.on('UnexpectedResponse',                        function transportUnexpectedResponse(exception) {        this.loadingTask._capability.reject(          new UnexpectedResponseException(exception.message, exception.status));      }, this);      messageHandler.on('UnknownError',                        function transportUnknownError(exception) {        this.loadingTask._capability.reject(          new UnknownErrorException(exception.message, exception.details));      }, this);      messageHandler.on('DataLoaded', function transportPage(data) {        this.downloadInfoCapability.resolve(data);      }, this);      messageHandler.on('PDFManagerReady', function transportPage(data) {        if (this.pdfDataRangeTransport) {          this.pdfDataRangeTransport.transportReady();        }      }, this);      messageHandler.on('StartRenderPage', function transportRender(data) {        if (this.destroyed) {          return; // Ignore any pending requests if the worker was terminated.        }        var page = this.pageCache[data.pageIndex];        page.stats.timeEnd('Page Request');        page._startRenderPage(data.transparency, data.intent);      }, this);      messageHandler.on('RenderPageChunk', function transportRender(data) {        if (this.destroyed) {          return; // Ignore any pending requests if the worker was terminated.        }        var page = this.pageCache[data.pageIndex];        page._renderPageChunk(data.operatorList, data.intent);      }, this);      messageHandler.on('commonobj', function transportObj(data) {        if (this.destroyed) {          return; // Ignore any pending requests if the worker was terminated.        }        var id = data[0];        var type = data[1];        if (this.commonObjs.hasData(id)) {          return;        }        switch (type) {          case 'Font':            var exportedData = data[2];            var font;            if ('error' in exportedData) {              var error = exportedData.error;              warn('Error during font loading: ' + error);              this.commonObjs.resolve(id, error);              break;            } else {              font = new FontFaceObject(exportedData);            }            this.fontLoader.bind(              [font],              function fontReady(fontObjs) {                this.commonObjs.resolve(id, font);              }.bind(this)            );            break;          case 'FontPath':            this.commonObjs.resolve(id, data[2]);            break;          default:            error('Got unknown common object type ' + type);        }      }, this);      messageHandler.on('obj', function transportObj(data) {        if (this.destroyed) {          return; // Ignore any pending requests if the worker was terminated.        }        var id = data[0];        var pageIndex = data[1];        var type = data[2];        var pageProxy = this.pageCache[pageIndex];        var imageData;        if (pageProxy.objs.hasData(id)) {          return;        }        switch (type) {          case 'JpegStream':            imageData = data[3];            loadJpegStream(id, imageData, pageProxy.objs);            break;          case 'Image':            imageData = data[3];            pageProxy.objs.resolve(id, imageData);            // heuristics that will allow not to store large data            var MAX_IMAGE_SIZE_TO_STORE = 8000000;            if (imageData && 'data' in imageData &&                imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {              pageProxy.cleanupAfterRender = true;            }            break;          default:            error('Got unknown object type ' + type);        }      }, this);      messageHandler.on('DocProgress', function transportDocProgress(data) {        if (this.destroyed) {          return; // Ignore any pending requests if the worker was terminated.        }        var loadingTask = this.loadingTask;        if (loadingTask.onProgress) {          loadingTask.onProgress({            loaded: data.loaded,            total: data.total          });        }      }, this);      messageHandler.on('PageError', function transportError(data) {        if (this.destroyed) {          return; // Ignore any pending requests if the worker was terminated.        }        var page = this.pageCache[data.pageNum - 1];        var intentState = page.intentStates[data.intent];        if (intentState.displayReadyCapability) {          intentState.displayReadyCapability.reject(data.error);        } else {          error(data.error);        }      }, this);      messageHandler.on('UnsupportedFeature',          function transportUnsupportedFeature(data) {        if (this.destroyed) {          return; // Ignore any pending requests if the worker was terminated.        }        var featureId = data.featureId;        var loadingTask = this.loadingTask;        if (loadingTask.onUnsupportedFeature) {          loadingTask.onUnsupportedFeature(featureId);        }        PDFJS.UnsupportedManager.notify(featureId);      }, this);      messageHandler.on('JpegDecode', function(data) {        if (this.destroyed) {          return Promise.reject('Worker was terminated');        }        var imageUrl = data[0];        var components = data[1];        if (components !== 3 && components !== 1) {          return Promise.reject(            new Error('Only 3 components or 1 component can be returned'));        }        return new Promise(function (resolve, reject) {          var img = new Image();          img.onload = function () {            var width = img.width;            var height = img.height;            var size = width * height;            var rgbaLength = size * 4;            var buf = new Uint8Array(size * components);            var tmpCanvas = createScratchCanvas(width, height);            var tmpCtx = tmpCanvas.getContext('2d');            tmpCtx.drawImage(img, 0, 0);            var data = tmpCtx.getImageData(0, 0, width, height).data;            var i, j;            if (components === 3) {              for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {                buf[j] = data[i];                buf[j + 1] = data[i + 1];                buf[j + 2] = data[i + 2];              }            } else if (components === 1) {              for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {                buf[j] = data[i];              }            }            resolve({ data: buf, width: width, height: height});          };          img.onerror = function () {            reject(new Error('JpegDecode failed to load image'));          };          img.src = imageUrl;        });      }, this);    },    getData: function WorkerTransport_getData() {      return this.messageHandler.sendWithPromise('GetData', null);    },    getPage: function WorkerTransport_getPage(pageNumber, capability) {      if (pageNumber <= 0 || pageNumber > this.numPages ||          (pageNumber|0) !== pageNumber) {        return Promise.reject(new Error('Invalid page request'));      }      var pageIndex = pageNumber - 1;      if (pageIndex in this.pagePromises) {        return this.pagePromises[pageIndex];      }      var promise = this.messageHandler.sendWithPromise('GetPage', {        pageIndex: pageIndex      }).then(function (pageInfo) {        if (this.destroyed) {          throw new Error('Transport destroyed');        }        var page = new PDFPageProxy(pageIndex, pageInfo, this);        this.pageCache[pageIndex] = page;        return page;      }.bind(this));      this.pagePromises[pageIndex] = promise;      return promise;    },    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref });    },    getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {      return this.messageHandler.sendWithPromise('GetAnnotations', {        pageIndex: pageIndex,        intent: intent,      });    },    getDestinations: function WorkerTransport_getDestinations() {      return this.messageHandler.sendWithPromise('GetDestinations', null);    },    getDestination: function WorkerTransport_getDestination(id) {      return this.messageHandler.sendWithPromise('GetDestination', { id: id });    },    getPageLabels: function WorkerTransport_getPageLabels() {      return this.messageHandler.sendWithPromise('GetPageLabels', null);    },    getAttachments: function WorkerTransport_getAttachments() {      return this.messageHandler.sendWithPromise('GetAttachments', null);    },    getJavaScript: function WorkerTransport_getJavaScript() {      return this.messageHandler.sendWithPromise('GetJavaScript', null);    },    getOutline: function WorkerTransport_getOutline() {      return this.messageHandler.sendWithPromise('GetOutline', null);    },    getMetadata: function WorkerTransport_getMetadata() {      return this.messageHandler.sendWithPromise('GetMetadata', null).        then(function transportMetadata(results) {        return {          info: results[0],          metadata: (results[1] ? new Metadata(results[1]) : null)        };      });    },    getStats: function WorkerTransport_getStats() {      return this.messageHandler.sendWithPromise('GetStats', null);    },    startCleanup: function WorkerTransport_startCleanup() {      this.messageHandler.sendWithPromise('Cleanup', null).        then(function endCleanup() {        for (var i = 0, ii = this.pageCache.length; i < ii; i++) {          var page = this.pageCache[i];          if (page) {            page.cleanup();          }        }        this.commonObjs.clear();        this.fontLoader.clear();      }.bind(this));    }  };  return WorkerTransport;})();/** * A PDF document and page is built of many objects. E.g. there are objects * for fonts, images, rendering code and such. These objects might get processed * inside of a worker. The `PDFObjects` implements some basic functions to * manage these objects. * @ignore */var PDFObjects = (function PDFObjectsClosure() {  function PDFObjects() {    this.objs = {};  }  PDFObjects.prototype = {    /**     * Internal function.     * Ensures there is an object defined for `objId`.     */    ensureObj: function PDFObjects_ensureObj(objId) {      if (this.objs[objId]) {        return this.objs[objId];      }      var obj = {        capability: createPromiseCapability(),        data: null,        resolved: false      };      this.objs[objId] = obj;      return obj;    },    /**     * If called *without* callback, this returns the data of `objId` but the     * object needs to be resolved. If it isn't, this function throws.     *     * If called *with* a callback, the callback is called with the data of the     * object once the object is resolved. That means, if you call this     * function and the object is already resolved, the callback gets called     * right away.     */    get: function PDFObjects_get(objId, callback) {      // If there is a callback, then the get can be async and the object is      // not required to be resolved right now      if (callback) {        this.ensureObj(objId).capability.promise.then(callback);        return null;      }      // If there isn't a callback, the user expects to get the resolved data      // directly.      var obj = this.objs[objId];      // If there isn't an object yet or the object isn't resolved, then the      // data isn't ready yet!      if (!obj || !obj.resolved) {        error('Requesting object that isn\'t resolved yet ' + objId);      }      return obj.data;    },    /**     * Resolves the object `objId` with optional `data`.     */    resolve: function PDFObjects_resolve(objId, data) {      var obj = this.ensureObj(objId);      obj.resolved = true;      obj.data = data;      obj.capability.resolve(data);    },    isResolved: function PDFObjects_isResolved(objId) {      var objs = this.objs;      if (!objs[objId]) {        return false;      } else {        return objs[objId].resolved;      }    },    hasData: function PDFObjects_hasData(objId) {      return this.isResolved(objId);    },    /**     * Returns the data of `objId` if object exists, null otherwise.     */    getData: function PDFObjects_getData(objId) {      var objs = this.objs;      if (!objs[objId] || !objs[objId].resolved) {        return null;      } else {        return objs[objId].data;      }    },    clear: function PDFObjects_clear() {      this.objs = {};    }  };  return PDFObjects;})();/** * Allows controlling of the rendering tasks. * @class * @alias RenderTask */var RenderTask = (function RenderTaskClosure() {  function RenderTask(internalRenderTask) {    this._internalRenderTask = internalRenderTask;    /**     * Callback for incremental rendering -- a function that will be called     * each time the rendering is paused.  To continue rendering call the     * function that is the first argument to the callback.     * @type {function}     */    this.onContinue = null;  }  RenderTask.prototype = /** @lends RenderTask.prototype */ {    /**     * Promise for rendering task completion.     * @return {Promise}     */    get promise() {      return this._internalRenderTask.capability.promise;    },    /**     * Cancels the rendering task. If the task is currently rendering it will     * not be cancelled until graphics pauses with a timeout. The promise that     * this object extends will resolved when cancelled.     */    cancel: function RenderTask_cancel() {      this._internalRenderTask.cancel();    },    /**     * Registers callbacks to indicate the rendering task completion.     *     * @param {function} onFulfilled The callback for the rendering completion.     * @param {function} onRejected The callback for the rendering failure.     * @return {Promise} A promise that is resolved after the onFulfilled or     *                   onRejected callback.     */    then: function RenderTask_then(onFulfilled, onRejected) {      return this.promise.then.apply(this.promise, arguments);    }  };  return RenderTask;})();/** * For internal use only. * @ignore */var InternalRenderTask = (function InternalRenderTaskClosure() {  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,                              pageNumber) {    this.callback = callback;    this.params = params;    this.objs = objs;    this.commonObjs = commonObjs;    this.operatorListIdx = null;    this.operatorList = operatorList;    this.pageNumber = pageNumber;    this.running = false;    this.graphicsReadyCallback = null;    this.graphicsReady = false;    this.useRequestAnimationFrame = false;    this.cancelled = false;    this.capability = createPromiseCapability();    this.task = new RenderTask(this);    // caching this-bound methods    this._continueBound = this._continue.bind(this);    this._scheduleNextBound = this._scheduleNext.bind(this);    this._nextBound = this._next.bind(this);  }  InternalRenderTask.prototype = {    initalizeGraphics:        function InternalRenderTask_initalizeGraphics(transparency) {      if (this.cancelled) {        return;      }      if (PDFJS.pdfBug && 'StepperManager' in globalScope &&          globalScope.StepperManager.enabled) {        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);        this.stepper.init(this.operatorList);        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();      }      var params = this.params;      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,                                    this.objs, params.imageLayer);      this.gfx.beginDrawing(params.transform, params.viewport, transparency);      this.operatorListIdx = 0;      this.graphicsReady = true;      if (this.graphicsReadyCallback) {        this.graphicsReadyCallback();      }    },    cancel: function InternalRenderTask_cancel() {      this.running = false;      this.cancelled = true;      this.callback('cancelled');    },    operatorListChanged: function InternalRenderTask_operatorListChanged() {      if (!this.graphicsReady) {        if (!this.graphicsReadyCallback) {          this.graphicsReadyCallback = this._continueBound;        }        return;      }      if (this.stepper) {        this.stepper.updateOperatorList(this.operatorList);      }      if (this.running) {        return;      }      this._continue();    },    _continue: function InternalRenderTask__continue() {      this.running = true;      if (this.cancelled) {        return;      }      if (this.task.onContinue) {        this.task.onContinue.call(this.task, this._scheduleNextBound);      } else {        this._scheduleNext();      }    },    _scheduleNext: function InternalRenderTask__scheduleNext() {      if (this.useRequestAnimationFrame) {        window.requestAnimationFrame(this._nextBound);      } else {        Promise.resolve(undefined).then(this._nextBound);      }    },    _next: function InternalRenderTask__next() {      if (this.cancelled) {        return;      }      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,                                        this.operatorListIdx,                                        this._continueBound,                                        this.stepper);      if (this.operatorListIdx === this.operatorList.argsArray.length) {        this.running = false;        if (this.operatorList.lastChunk) {          this.gfx.endDrawing();          this.callback();        }      }    }  };  return InternalRenderTask;})();/** * (Deprecated) Global observer of unsupported feature usages. Use * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance. */PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() {  var listeners = [];  return {    listen: function (cb) {      deprecated('Global UnsupportedManager.listen is used: ' +                 ' use PDFDocumentLoadingTask.onUnsupportedFeature instead');      listeners.push(cb);    },    notify: function (featureId) {      for (var i = 0, ii = listeners.length; i < ii; i++) {        listeners[i](featureId);      }    }  };})();exports.getDocument = PDFJS.getDocument;exports.PDFDataRangeTransport = PDFDataRangeTransport;exports.PDFDocumentProxy = PDFDocumentProxy;exports.PDFPageProxy = PDFPageProxy;}));  }).call(pdfjsLibs);  exports.PDFJS = pdfjsLibs.pdfjsSharedGlobal.PDFJS;  exports.getDocument = pdfjsLibs.pdfjsDisplayAPI.getDocument;  exports.PDFDataRangeTransport =    pdfjsLibs.pdfjsDisplayAPI.PDFDataRangeTransport;  exports.renderTextLayer = pdfjsLibs.pdfjsDisplayTextLayer.renderTextLayer;  exports.AnnotationLayer =    pdfjsLibs.pdfjsDisplayAnnotationLayer.AnnotationLayer;  exports.CustomStyle = pdfjsLibs.pdfjsDisplayDOMUtils.CustomStyle;  exports.PasswordResponses = pdfjsLibs.pdfjsSharedUtil.PasswordResponses;  exports.InvalidPDFException = pdfjsLibs.pdfjsSharedUtil.InvalidPDFException;  exports.MissingPDFException = pdfjsLibs.pdfjsSharedUtil.MissingPDFException;  exports.UnexpectedResponseException =    pdfjsLibs.pdfjsSharedUtil.UnexpectedResponseException;}));
 |